web-dev-qa-db-fra.com

Activité onDestroy / Fragment onDestroyView set Pratiques nulles

Je lis ListFragment le 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 ont implémenté 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 sur mList sur onDestroy of ListActivity comme ils l'ont fait pour la classe ListFragment.

Ma question est

  1. Pourquoi les développeurs de Google n'ont pas défini Null sur mList dans onDestroy of ListActivity? Des raisons?

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

. Toutes les pratiques pour définir Null dans ces deux fonctions: onDestroy de l'activité et onDestroyView du fragment?

Merci pour vos idées!

32
user3078555

Donc, la différence entre les fragments et les activités est due au fait que leurs cycles de vie sont différents. Lorsqu'un Activity est détruit, il disparaît définitivement. Cependant, Fragments peut créer et détruire leurs vues plusieurs fois avant qu'elles ne soient réellement détruites. Pour clarification, dans une activité:

onDestroy()
onCreate()

ne se produira jamais dans l'ordre pour la même instance d'activité. Pour un fragment, ce qui suit est parfaitement valable:

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

Un cas où vous pouvez voir cela 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 dans les parages pour être facilement reprise lorsque l'utilisateur appuiera dessus pour y revenir (à quel moment onCreateView() sera à 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, car si cela se produit uniquement lors d'un changement de configuration, onDestroy() suivra immédiatement et l'instance entière 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 pas mal de mémoire si votre application a un grand backstack.

59
kcoppock