2016-04-25 11 views
5

私が働いているアプリでは、DialogFragmentでメモリリークが発生しています。これまでの修正方法は、DialogFragmentが破棄されたときにすべてのビューを削除することでした。やるべきことは?私はカスタムROMで作業しているので、おそらくこの問題と関係があるかどうかは分かりませんでした。ダイアログからすべてのビューを削除しないと、メモリがリークする原因になりますか?DialogFragment leaking memory

@Override 
    public void onDestroyView() { 
     if (getView() instanceof ViewGroup) { 
      ((ViewGroup)getView()).removeAllViews(); 
     } 
     super.onDestroyView(); 
    } 
+1

これを確認するには、ルートのない電話機 –

答えて

4

MemoryLeak、多くの原因のためにいくつかの一般的な原因発生します

  • をいくつか静的フィールドに(あなたのDialogFragmentのこの場合、インスタンスに)あなたのオブジェクトの参照してください。
  • ContextにスレッドまたはAsyncTaskスレッドもGC rootですので!
  • クラスに静的でない内部クラスがあります。この場合、内部クラスがGCルートに関連する場合(たとえば内部クラスがインスタンスの場合はAsyncTask)、メモリリークが発生します。

あなたのケースでは、GCルートに関連するビューがあります。そのビューはガベージコレクションできませんが、ビューを保持するダイアログもガベージコレクションできません。

5

これは私のアプリケーションにも起こり、Leakcanaryを使ってリークを発見しました。

EditTextでダイアログが表示されたときに表示されます。コールバックを使用して実装されたCursorの点滅は、EditTextを含むViewを閉じるときに正しく処理されません。そしてそれはこのことによって偶然に起こります。

https://code.google.com/p/android/issues/detail?id=188551

編集

そして、これは私がすべてのdialog.dismiss()前に行う方法です:

editText.setCursorVisible(false); 
dismiss(); 

は、この情報がお役に立てば幸い!