Подтвердить что ты не робот

Активность onDestroy/Фрагмент onDestroyView set Null practice

Я читаю исходный код 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.

Мой вопрос

  • Почему разработчики Google не устанавливали Null в mList в onDestroy ListActivity? Любые причины?

  • Нужно ли устанавливать Null для всех полей View в Activity onDestroy и Fragment onDestroyView?

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

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

4b9b3361

Ответ 1

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

onDestroy()
onCreate()

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

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

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

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

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

Ответ 2

Не нужно устанавливать значение null, если это не влияет на логику приложения. Например. if (mList == null)...