爲了避免內存泄漏,我想從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);
}
}
}
}
然而,我仍然得到了一些泄漏的方法調用這個方法。有什麼我缺少的。如果我在這裏犯了一個錯誤,有人可以糾正我。
你可以爲可疑的內存泄漏提供堆棧跟蹤嗎?因爲在android中,所有的視圖幾乎都與幾乎沒有監聽器相關聯。 –
@Maddy Blaklisted,在android中,每次將一個偵聽器分配給一個視圖時,都必須清除它(將該偵聽器設置爲null)以避免任何內存泄漏。 –