我在用Android數據綁定試驗MVVM。我的代碼如下:避免內存泄漏的好方法
public class ... extends Activity {
...
private CommentViewModel viewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this, provideLayout());
viewModel = new CommentViewModel(this);
binding.setViewModel(viewModel);
}
@Override
protected void onDestroy() {
viewModel = null; //setting view model to null to avoid leaks
super.onDestroy();
}
}
我試圖做的是,在我的onDestroy()
設置ViewModel
爲null,以避免任何可能的泄漏。
正如我ViewModel
自己註冊一些callbacks
與其他成分,並使用context
如果不去除,上下文傳遞的地方,我決定將它設置爲空的回調的一個可能泄漏。
但是我的同事開了一個有趣的討論,他說這是一個過時的做法,正如'Effective Java'所暗示的,這就是你在C++中的做法。他說,一個好方法是從ViewModel中刪除所有回調,而不是將其設置爲空。例如:
public class ... extends Activity {
...
private CommentViewModel viewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
...//same as above
}
@Override
protected void onDestroy() {
viewModel.removeCallbacks(); //removing all callbacks from view model to avoid leaks
super.onDestroy();
}
}
現在這兩種方法都能正常工作,但在第一種方法中,我非常確信泄漏不會發生。但結果是,它看起來有些醜陋。第二種方法工作正常,但它迫使我想想在ViewModel
中可能發生的所有可能的泄漏。
這可能是一個普遍的問題:您認爲哪種方法更好,爲什麼?
「使您的引用null不會讓GC更容易,但刪除回調會。」 - 你能解釋一下嗎?我不明白。兩者不是一回事嗎? –