web-dev-qa-db-ja.com

アクティビティのonDestroy /フラグメントのonDestroyViewはNullプラクティスを設定します

私は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に設定することはありませんでした。

私の質問は

  1. Google開発者がListActivityのonDestroyでNullをmListに設定しなかったのはなぜですか?理由は?

  2. ActivityのonDestroyおよびFragmentのonDestroyViewのすべてのViewフィールドにNullを設定する必要がありますか?

。これら2つの関数でNullを設定するためのプラクティス:アクティビティのonDestroyとフラグメントのonDestroyView?

あなたのアイデアをありがとう!

32
user3078555

そのため、フラグメントとアクティビティで異なるのは、ライフサイクルが異なるためです。 Activityが破壊されると、永久に消滅します。ただし、Fragmentsは、実際に破棄される前に、ビューを複数回作成および破棄する場合があります。明確にするために、アクティビティで:

_onDestroy()
onCreate()
_

シーケンスで発生することはありません同じActivityインスタンスの場合。フラグメントの場合、以下は完全に有効です。

_onCreate()
onCreateView()
onDestroyView()
onCreateView()
onDestroyView()
onDestroy()
_

これを見ることができる1つのケースは、Fragmentがバックスタックに入るときです。ビューは破棄されます(表示されなくなったため)が、ユーザーが戻って(onCreateView()が再び呼び出された時点で)押すと、インスタンスは簡単に再開できるように残ります。

onDestroyView()の後、すべてのView参照を解放して、それらをガベージコレクションできるようにすることができます(そうすべきです)。多くの場合、構成の変更中に発生したように、onDestroy()がすぐに続き、インスタンス全体がガベージコレクションされるため、必要ありません。

基本的に、onDestroyView()内のすべてのビュー参照を解放することをお勧めします。アプリのバックスタックが大きい場合は、かなりのメモリを節約できます。

59
kcoppock