2017-09-14 108 views
0

爲了避免內存泄漏,我想從android視圖中刪除所有偵聽器和觀察者。對於TextWatcher,我知道必須在數據結構中保存每個添加了addTextChangedListener()的引用,並在稍後(在onDestroy中)使用removeTextChangedListener()將其刪除。但對於視圖的其他聽衆,是否有一種方法可以將它們全部設置爲空。 到目前爲止,我一直在我的大部分視圖上使用這個(編輯:已分配任何監聽器的所有視圖;再加上這在onDestroy()和/或onDestroyView()中調用,具體視情況而定):從視圖中刪除所有偵聽器android

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

你可以爲可疑的內存泄漏提供堆棧跟蹤嗎?因爲在android中,所有的視圖幾乎都與幾乎沒有監聽器相關聯。 –

+0

@Maddy Blaklisted,在android中,每次將一個偵聽器分配給一個視圖時,都必須清除它(將該偵聽器設置爲null)以避免任何內存泄漏。 –

回答

0

在Android中,默認情況下,幾乎所有視圖中的偵聽器都爲null,直到初始化爲止。

所以設置爲null 完全沒有必要

爲什麼你認爲有內存泄漏。有沒有錯誤日誌?

+0

我在已分配偵聽器的每個視圖上調用此方法。在一個活動中,當它在onDestroyView()中被調用時,它在onDestroy()中被調用。由於Java堆轉儲中的跟蹤,我認爲存在內存泄漏 –

0

聽衆通常不會引起任何內存泄漏除非創建或操縱它們不當以這樣一種方式,他們在內存中創建任何循環或循環引用。更多信息可以在here找到!

如果您正確創建和/或使用偵聽器,則永遠不需要不必要地刪除偵聽器。

進一步建議通過Official Android Documentation for Avoiding Memory Leaks!爲進一步協助。