メモリリークを回避するために、すべてのリスナーとウォッチャーをアンドロイドビューから削除します。 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);
}
}
}
}
まだこのメソッドによって呼び出されたビューが漏れています。私が紛失しているものはありますか?私がここで間違いを犯すと誰かが私を正してくれますか?
疑わしいメモリリークのスタックトレースを提供できますか?アンドロイドでは、すべてのビューにリスナーがほとんど関連付けられていないためです。 –
@Maddy Blaklisted、androidで、リスナーをビューに割り当てるたびに、メモリリークを避けるためにリスナーをクリア(nullに設定)する必要があります。 –