要避免內存泄漏,請遵循以下步驟:
使用 ViewModel 和 LiveData:確保在 ViewModel 中使用 LiveData,而不是直接使用可變狀態。ViewModel 和 LiveData 是為了在配置更改(如屏幕旋轉)時保持 UI 組件與數據同步而設計的,它們會自動處理生命周期問題。
避免使用 ViewModel 存儲 Activity 或 Fragment 的引用:ViewModel 不應該持有 Activity 或 Fragment 的強引用,因為這會導致內存泄漏。如果需要訪問 UI 組件,請使用 LiveData 和觀察者模式。
在 Activity 或 Fragment 中正確使用 ViewModelProvider:在 Activity 或 Fragment 中,使用 ViewModelProvider 創建 ViewModel 實例。確保在 onStop() 方法中取消觀察 LiveData,以避免內存泄漏。例如:
public class MyActivity extends AppCompatActivity {
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myViewModel = new ViewModelProvider(this).get(MyViewModel.class);
// 觀察 LiveData
myViewModel.getSomeLiveData().observe(this, data -> {
// 更新 UI
});
}
@Override
protected void onStop() {
super.onStop();
// 取消觀察 LiveData,避免內存泄漏
myViewModel.getSomeLiveData().removeObserver(this);
}
}
public class MyViewModel extends ViewModel {
private final WeakReference<MyActivity> activityRef;
public MyViewModel(@NonNull Application application, @Nullable LifecycleOwner owner) {
super(application, owner);
activityRef = new WeakReference<>(ApplicationProvider.getApplicationContext().getActivity());
}
public void someMethod() {
MyActivity activity = activityRef.get();
if (activity != null) {
// 訪問 Activity 的成員和方法
}
}
}
遵循這些步驟可以有效地避免在使用 ViewModelProvider 時出現內存泄漏。