2017-09-14 10 views
0

メモリリークを回避するために、すべてのリスナーとウォッチャーをアンドロイドビューから削除します。 TextWatcherでは、addTextChangedListener()で追加された各参照をデータ構造体に保存し、removeTextChangedListener()で後で(onDestroy内で)削除する必要があることを知っています。しかし、ビューの他のリスナーにとっては、それらをすべてnullに設定することができる方法があります。 これまで私はほとんどの私のビュー(EDIT:)にリスナーを割り当てられたすべてのビューを使用していましたが、これはonDestroy()および/またはonDestroyView()で呼び出されました:ビューからすべてのリスナーを削除します。

public static void releaseView(View view){ 
     if(view != null){ 
      view.removeCallbacks(null); 
      if(!(view instanceof AdapterView)) { 
       view.setOnClickListener(null); 
       view.setOnTouchListener(null); 
       view.setOnLongClickListener(null); 
       view.setOnDragListener(null); 
       view.setOnFocusChangeListener(null); 
       view.setOnKeyListener(null); 

       if (view instanceof TextView) { 
        ((TextView) view).setOnEditorActionListener(null); 
        ((TextView) view).setKeyListener(null); 


        if(view instanceof CheckBox) 
         ((CheckBox) view).setOnCheckedChangeListener(null); 
       } 
      } 
      else { 
       if (view instanceof ListView) { 
        ((ListView) view).setOnItemClickListener(null); 
        ((ListView) view).setOnItemLongClickListener(null); 
        ((ListView) view).setOnItemSelectedListener(null); 
        ((ListView) view).setOnScrollListener(null); 
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) //if Marshamallow => API 23 
         ((ListView) view).setOnScrollChangeListener(null); 
        ((ListView) view).setAdapter(null); 
        //return; 
       } 

       if (view instanceof Spinner) { 
        ((Spinner) view).setOnItemSelectedListener(null); 
        //return; 
       } 

       if (view instanceof GridView) { 
        ((GridView) view).setOnItemSelectedListener(null); 
        ((GridView) view).setAdapter(null);      
       } 
      }   
     } 
    } 

まだこのメソッドによって呼び出されたビューが漏れています。私が紛失しているものはありますか?私がここで間違いを犯すと誰かが私を正してくれますか?

+0

疑わしいメモリリークのスタックトレースを提供できますか?アンドロイドでは、すべてのビューにリスナーがほとんど関連付けられていないためです。 –

+0

@Maddy Blaklisted、androidで、リスナーをビューに割り当てるたびに、メモリリークを避けるためにリスナーをクリア(nullに設定)する必要があります。 –

答えて

0

Androidでは、初期化するまで、デフォルトでビューのリスナーのほとんどがnullになります。

だからヌルを設定することは絶対に不要 ある

なぜあなたはメモリリークがあると思います。エラーログはありますか?

+0

リスナーが割り当てられたすべてのビューでこのメソッドを呼び出します。あるアクティビティでは、フラグメント内にあるときにonDestroy()で呼び出され、onDestroyView()で呼び出されます。私はJavaのヒープダンプのトレースのためにメモリリークがあると思います –

0

あなたが不適切彼らは、メモリ内の任意の環状または循環参照を作成するような方法でそれらを作成したり、操作ない限り、通常のリスナーは、任意のメモリがをリークが発生しません。詳細はhereをご覧ください!

リスナーを適切に作成または使用する場合は、不要にリスナーを削除する必要はありません。

さらにOfficial Android Documentation for Avoiding Memory Leaksを通過することをお勧めします。さらなる支援のために。

関連する問題