Действия onDestroy / фрагмента onDestroyView установить нулевые практики

Я читаю 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 установили Null для всех полей просмотра, объявленных в ListFragment и удалить обратный вызов "mRequestFocus".

на ListActivity исходный код. Разработчики Google реализовали, как показано ниже:

protected ListAdapter mAdapter;
protected ListView mList;

private Handler mHandler = new Handler();


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

Я не видел, чтобы разработчики Google устанавливали Null в mList на onDestroy ListActivity, как они это делали для Класс ListFragment.

у меня вопрос

  1. Почему разработчики Google не установить null в матричноориентированного списка в onDestroy от ListActivity? Каких-либо причин?

  2. нужно ли устанавливать Null для всех полей представления в onDestroy Activity и Ondestroyview фрагмента?

3. Любые практики для set Null в этих двух функциях: Activity onDestroy и Fragment onDestroyView?

Спасибо за ваши идеи!

2 ответов


таким образом, причина различий между фрагментами и действиями заключается в том, что их жизненные циклы различны. Когда Activity разрушен, он уходит навсегда. Однако,Fragments может создавать и уничтожать свои представления несколько раз, прежде чем они будут фактически уничтожены. Для уточнения, в деятельности:

onDestroy()
onCreate()

никогда не произойдет в последовательности для того же экземпляра действия. Для фрагмента следующее прекрасно действительно:

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

один случай, когда вы можете видеть это, когда Fragment идет в резервную стопку. Его вид будет уничтожен (поскольку он больше не виден), но экземпляр останется вокруг, чтобы быть легко возобновленным, когда пользователь нажимает назад, чтобы вернуться к нему (в этот момент onCreateView() снова будет).

после onDestroyView(), вы можете (и вероятно должны) все View ссылки, чтобы позволить им быть собранным "мусор". Во многих случаях это не обязательно, так как если это происходит только во время изменения конфигурации,onDestroy() последует незамедлительно и весь экземпляр будет собран "мусор".

по сути, я бы сказал, что это хорошая практика, чтобы освободить все ссылки на просмотр в onDestroyView(), и может сэкономить довольно много памяти, если ваше приложение имеет большой backstack.


нет необходимости устанавливать null, если это не влияет на логику приложения. Е. Г. если (матричноориентированного списка == значение null) ...