2017-01-02 4 views
1

私は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で発生する可能性のあるすべてのリークについて考えるようになります。

これは一般的な質問かもしれません。どちらのアプローチがより良いと思いますか、なぜですか?

答えて

0

一般的に言えば、JVMはその仕事をします。

大きなアプリケーションの生産コードで

System.gc() 

のようなものよりも刺激性は何もありません。ミドルウェア・エンジニアがJVMを調整し、メモリ管理の仕方を教えてくれています。本当に私はこれらの人々として話しています。あなたのケースでは、物事は同じです、Androidを開発する人は、その中でGCを管理する方法を最もよく知っています。よりクリーンで理解しやすいものにするつもりがない場合は、コードを書くべきではありません。一方

Expiriencedプログラマはフレームワーク(例:stackoverflow.com/questions/13534030/can-a-scheduled-future-cause-a-memory-leak)に接続されたすべての汚い手口を知っている必要があります

逆参照ではなく、閉じていないなど、メモリリークを起こす可能性があります。

あなたのケースでもっと重要なことは、非常に複雑なコールバックがあることをイメージすることができます(循環型であり、数千もあると仮定しましょう)。 GCの方が簡単ですが、コールバックを削除すると簡単になります。

+0

"参照をnullにしてもGCは簡単にはなりませんが、コールバックは削除されます。 - それについて少し説明できますか?理解できませんでした。両方が同じものではありませんか? –

関連する問題