OnDestroy de l'activité / Ondestroyview de Fragment définit les pratiques Null

Je lis ListFragment code source et je vois cette implémentation:

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();
}

Dans Cette fonction, les développeurs de Google définissent Null sur tous les champs d'affichage déclarés dans ListFragment et suppriment le rappel 'mRequestFocus'.

Dans ListActivity code source. Les développeurs Google mis en œuvre comme ci-dessous:

protected ListAdapter mAdapter;
protected ListView mList;

private Handler mHandler = new Handler();


@Override
protected void onDestroy() {
    mHandler.removeCallbacks(mRequestFocus);
    super.onDestroy();
}

Je n'ai pas vu les développeurs Google définir Null à mList sur onDestroy de ListActivity comme ils l'ont fait pour la classe ListFragment.

Ma question est

  1. Pourquoi les développeurs google didnot mis Null à mList dans onDestroy de ListActivity? Toutes les raisons?

  2. Avons-nous besoin de définir Null sur tous les champs de vue dans onDestroy de L'activité et onDestroyView de Fragment?

3. Toutes les pratiques pour set Null dans ces deux fonctions: onDestroy de L'activité et onDestroyView de Fragment?

Merci pour vos idées!

31
demandé sur kcoppock 2014-10-15 00:41:35

2 réponses

Donc, la raison pour laquelle il est différent entre les Fragments et les activités est parce que leurs cycles de vie sont différents. Quand un {[2] } est détruit, il s'en va pour de bon. Cependant, {[3] } peut créer et détruire leurs vues plusieurs fois avant qu'elles ne soient réellement détruites. Pour clarifier, dans une activité:

onDestroy()
onCreate()

Ne se produira jamais en Séquence pour la même instance D'Activité . Pour un Fragment, ce qui suit est parfaitement valide:

onCreate()
onCreateView()
onDestroyView()
onCreateView()
onDestroyView()
onDestroy()

Un cas où vous pouvez voir ceci est quand un Fragment va dans la pile arrière. Sa vue sera détruite (car elle n'est plus visible) mais l'instance restera pour être facilement reprise lorsque l'utilisateur appuie sur back pour y revenir (à quel point onCreateView() sera de nouveau appelé).

Après onDestroyView(), Vous pouvez (et devriez probablement) libérer toutes vos références View pour leur permettre d'être récupérées. Dans de nombreux cas, ce n'est pas nécessaire, comme si cela se produisait juste lors d'un changement de configuration, onDestroy() suivra immédiatement et toute l'instance sera récupérée.

Essentiellement, je dirais que c'est une bonne pratique de libérer toutes les références de vue dans onDestroyView(), et pourrait économiser un peu de mémoire si votre application a un grand backstack.

51
répondu kcoppock 2014-10-14 20:49:28

Pas besoin de définir null si cela n'influence pas la logique de l'application. Par exemple, if (mList == null) ...

0
répondu Volodymyr Lykhonis 2014-10-14 20:45:09