私はListFragmentソースコードを読んでいますが、この実装を見ています:
ListAdapter mAdapter;
ListView mList;
View mEmptyView;
TextView mStandardEmptyView;
View mProgressContainer;
View mListContainer;
CharSequence mEmptyText;
boolean mListShown;
/**
* Detach from list view.
*/
@Override
public void onDestroyView() {
mHandler.removeCallbacks(mRequestFocus);
mList = null;
mListShown = false;
mEmptyView = mProgressContainer = mListContainer = null;
mStandardEmptyView = null;
super.onDestroyView();
}
この関数では、Google開発者はListFragmentで宣言されたすべてのビューフィールドにNullを設定し、コールバック「mRequestFocus」を削除します。
ListActivityソースコード。以下のように実装されたGoogle開発者:
protected ListAdapter mAdapter;
protected ListView mList;
private Handler mHandler = new Handler();
@Override
protected void onDestroy() {
mHandler.removeCallbacks(mRequestFocus);
super.onDestroy();
}
Googleの開発者は、ListFragmentクラスの場合のように、ListActivityのonDestroyでNullをmListに設定することはありませんでした。
私の質問は
Google開発者がListActivityのonDestroyでNullをmListに設定しなかったのはなぜですか?理由は?
ActivityのonDestroyおよびFragmentのonDestroyViewのすべてのViewフィールドにNullを設定する必要がありますか?
。これら2つの関数でNullを設定するためのプラクティス:アクティビティのonDestroyとフラグメントのonDestroyView?
あなたのアイデアをありがとう!
そのため、フラグメントとアクティビティで異なるのは、ライフサイクルが異なるためです。 Activity
が破壊されると、永久に消滅します。ただし、Fragments
は、実際に破棄される前に、ビューを複数回作成および破棄する場合があります。明確にするために、アクティビティで:
_onDestroy()
onCreate()
_
シーケンスで発生することはありません同じActivityインスタンスの場合。フラグメントの場合、以下は完全に有効です。
_onCreate()
onCreateView()
onDestroyView()
onCreateView()
onDestroyView()
onDestroy()
_
これを見ることができる1つのケースは、Fragment
がバックスタックに入るときです。ビューは破棄されます(表示されなくなったため)が、ユーザーが戻って(onCreateView()
が再び呼び出された時点で)押すと、インスタンスは簡単に再開できるように残ります。
onDestroyView()
の後、すべてのView
参照を解放して、それらをガベージコレクションできるようにすることができます(そうすべきです)。多くの場合、構成の変更中に発生したように、onDestroy()
がすぐに続き、インスタンス全体がガベージコレクションされるため、必要ありません。
基本的に、onDestroyView()
内のすべてのビュー参照を解放することをお勧めします。アプリのバックスタックが大きい場合は、かなりのメモリを節約できます。