私は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()
にnullに私のViewModel
を設定することは可能性のあるリークを避けるために、ということです。私ViewModel
として
自体は他のコンポーネントと、いくつかのcallbacks
を登録し、それらのコールバックのいずれかが削除されていない状況がどこかに渡され、私はそれがnullに設定することを決めた場合に漏れる可能性がcontext
を使用しています。
しかし私の同僚は興味深い議論を開きました。ここでは、これは「効果的な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();
}
}
両方のアプローチはうまくいきますが、最初のアプローチではリークが起こらないことを非常に確信しています。しかし結果として、それは幾分醜いように見えます。 2番目のアプローチはうまくいきますが、ViewModel
で発生する可能性のあるすべてのリークについて考えるようになります。
これは一般的な質問かもしれません。どちらのアプローチがより良いと思いますか、なぜですか?
"参照をnullにしてもGCは簡単にはなりませんが、コールバックは削除されます。 - それについて少し説明できますか?理解できませんでした。両方が同じものではありませんか? –