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

Я не нашел для этого решения, возможно, потому что, если вы думаете о жизненном цикле фрагмента, вы должны понимать, когда вы проверите нулевое значение.