【发布时间】:2017-05-16 21:30:19
【问题描述】:
我正在用 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,如果其中一个回调未被删除并且上下文被传递到某处,则可能会泄漏,我决定将其设置为null。
但是我的同事发起了一个有趣的讨论,他说这是一种过时的做法,正如“有效的 Java”所暗示的那样,这就是你在 C++ 中的做法。他说一个好的方法是从 ViewModel 中删除所有回调,而不是将其设置为 null。比如:
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 中可能发生的所有可能的泄漏。
这可能是一个普遍的问题:您认为哪种方法更好,为什么?
【问题讨论】:
标签: java android mvvm memory-leaks garbage-collection