为了避免内存泄漏,我想要从 Android 视图中移除所有的监听器和观察者。对于 TextWatcher,我知道需要将每个使用 addTextChangedListener() 添加的引用保存在数据结构中,并在 onDestroy 时使用 removeTextChangedListener() 进行移除。但对于视图的其他监听器,是否有一种方法可以找到它们并将它们设置为 null 呢?
到目前为止,在我的大多数视图上(EDIT: 所有已分配任何监听器的视图;根据情况,在 onDestroy() 和/或 onDestroyView() 中调用此方法):
到目前为止,在我的大多数视图上(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);
}
}
}
}
然而,我仍然会得到一些被此方法调用的视图泄漏的问题。是否有什么我遗漏的地方?如果我犯了错误,请有人指出。