Android Fragment getActivity() = null
Я использую фрагменты в своем приложении. И очень распространенная проблема при использовании их - это NPE при использовании getActivity(). Я знаю, что мы можем решить это, проверив, если getActivity() != null
каждый раз, или проверяя, есть ли фрагмент isAdded()
.
В одном из моих классов я получаю контекст активности более чем в 60 местах. Если getActivity() не является нулевым или если фрагмент по-прежнему добавлен к активности во всех местах, он делает код уродливым, большим и не ремонтируемым. Есть ли другой способ справиться с этим?
Возможно ли даже уничтожить фрагмент (и остановить любую работу, которую он выполнял при удалении), когда он удален из этой операции?
Также этот способ предложен?
Ответы
Ответ 1
По моему опыту, большинство случаев getActivity(), возвращающих null, относятся к асинхронным обратным вызовам.
Например, ваш фрагмент запускает AsyncTask, а затем удаляется перед выполнением фонового задания, а затем, когда фоновое задание завершается и вызывает getActivity() в onPostExecute(), он получит нуль, поскольку фрагмент уже отделен от деятельности.
Мое решение:
1.Проверьте getActivity() == null в начале каждого асинхронного обратного вызова, если это случай, то просто прервите метод.
2. Отмените асинхронные задания в onDetach().
И я думаю, что это лучшее решение, чем сохранение экземпляра активности в onAttach(), потому что, поскольку ваш фрагмент удален, зачем беспокоиться о выполнении всех заданий, оставшихся в обратных вызовах (в большинстве случаев, кодах UI)?
Ответ 2
getActivity будет повторно инициализирован в методе - onActivityCreated().
Так что безопаснее вызвать getActivity() сразу после onActivityCreated() (согласно жизненному циклу фрагментов http://developer.android.com/guide/components/fragments.html) - например, в onStart() - в этом случае он БУДЕТ НИКОГДА НЕ НУЛЛ - не нужно делать бесполезные проверки, такие как isAdded и getActivity!= null.
P.S. Если мы используем это решение:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mActivity = activity;
}
mActivity никогда не будет нулевым, но позже в методе onActivityCreated() getActivity() стал другим с mActivity.
Мое мнение - уверен, что мы сможем сохранить всю активность в переменной, но безопаснее следить за процессом жизненного цикла андроидных фрагментов и получать активность сразу после onActivityCreated()
Ответ 3
Я думаю, вы должны использовать метод Fragment
onAttach(Activity)
.
Я думаю, что это должно помочь вам избежать всех этих NPE.
Ответ 4
Мое решение переопределяет метод onSaveInstanceState в BaseActivity:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//solution of fragment.getActivity() is null
outState.remove("android:support:fragments");
}
Ответ 5
Я не нашел для этого решения, возможно, потому что, если вы думаете о жизненном цикле фрагмента, вы должны понимать, когда вы проверите нулевое значение.