Я редко получаю эту ошибку при вызове API.
java.lang.IllegalStateException: Fragment not attached to Activity
Я попытался поместить код в isAdded()
метод, чтобы проверить, добавлен ли фрагмент в настоящее время к его активности, но все же я редко получаю эту ошибку. Я не понимаю, почему я все еще получаю эту ошибку. Как я могу предотвратить это?
Это показывает ошибку на линии
cameraInfo.setId(getResources().getString(R.string.camera_id));
Ниже приведен пример вызова API, который я делаю.
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
android
android-fragments
android-activity
android-volley
android-lifecycle
Android-разработчик
источник
источник
Ответы:
Эта ошибка происходит из-за совместного влияния двух факторов:
onResponse()
илиonError()
(которые работают в основном потоке), не зная,Activity
находится ли все еще на переднем плане или нет. ЕслиActivity
нет (пользователь перешел в другое место),getActivity()
возвращает значение NULL.Response
выражается как анонимный внутренний класс, который неявно содержит сильную ссылку на внешнийActivity
класс. Это приводит к классической утечке памяти.Чтобы решить эту проблему, вы всегда должны сделать:
а также используйте
isAdded()
вonError()
методе также:источник
AsyncTask
s изнутриActivity
, нет надежного способа избежать NPE. Всегда есть вероятность, что пользователь может отойти от текущего,Activity
пока один из потоков что-то делает в фоновом режиме, а затем, когда поток завершает работуonPostExecute()
илиonResponse()
вызывается, нетActivity
. Все, что вы можете сделать, это проверять нулевые ссылки в различных точках вашего кода, и это не пуленепробиваемо :)added
логический флаг и показывает, является ли текущийActivity
экземпляр текущимnull
или нет.Жизненный цикл фрагмента очень сложен и полон ошибок, попробуйте добавить:
источник
return mHost != null && mAdded;
- это то, что внутри метода frag.isAdded (). Я думал, что mHost - это действие, если вы его отслеживаете, но кажется, что mHost находится внутри FragmentActivity. Так что, наверное, ты прав. Есть дополнения?Я нашел очень простое решение - метод isAdded (), который является одним из методов фрагмента, чтобы определить, привязан этот текущий фрагмент к его активности или нет.
мы можем использовать это как везде в классе фрагмента, как:
источник
Исключение: java.lang.IllegalStateException: фрагмент
DeadlineListFragment {ad2ef970} не присоединен к Activity
Категория: Жизненный цикл
Описание : при выполнении длительной операции в фоновом потоке (например, AsyncTask) тем временем был создан новый фрагмент, который был отсоединен от действия до завершения фонового потока. Код в потоке пользовательского интерфейса (например, onPostExecute) вызывает отдельный фрагмент, вызывая такое исключение.
Исправить решение:
Отмена фонового потока при приостановке или остановке фрагмента
Используйте isAdded (), чтобы проверить, прикреплен ли фрагмент, а затем получить getResources () из действия.
источник
я могу опоздать, но могу помочь кому-то ..... Лучшее решение для этого - создать глобальный экземпляр класса приложения и вызвать его в определенном фрагменте, к которому ваша активность не привязана
как показано ниже
Вот класс приложения
источник
Эта ошибка может произойти, если вы создаете экземпляр фрагмента, который каким-либо образом не может быть создан:
В моем случае я встречал это, когда пытался использовать:
источник
Использование фрагмента
isAdded()
Он вернет true, если фрагмент в настоящее время присоединен к Activity.Если вы хотите проверить внутри деятельности
Надеюсь, это поможет кому-то
источник
Я принял следующий подход для решения этой проблемы. Создан новый класс, который действует как обертка для таких методов деятельности
Теперь, где бы мне ни понадобился доступ к ресурсам из фрагментов или действий, вместо прямого вызова метода, я использую этот класс. В случае, если действие
context
не является,null
оно возвращает значение актива, а в случае, если оноcontext
является нулевым, оно передает значение по умолчанию (которое также указывается вызывающей функцией).Важно! Это не решение, это эффективный способ, с помощью которого вы можете изящно справиться с таким сбоем. Вы хотели бы добавить несколько журналов в случаях, когда вы получаете экземпляр активности как нулевой, и попытайтесь исправить это, если это возможно.
источник
это происходит, когда фрагмент не имеет контекста, поэтому метод getActivity () возвращает значение null. проверьте, используете ли вы контекст перед тем, как его получить , или активность больше не существует. используйте context во фрагменте. Создайте, и после ответа API обычно возникает эта проблема.
источник
Иногда это исключение вызвано ошибкой в реализации библиотеки поддержки. Недавно мне пришлось понизить рейтинг с 26.1.0 до 25.4.0, чтобы избавиться от него.
источник
Эта проблема возникает всякий раз, когда вы вызываете контекст, который недоступен или имеет значение null при его вызове. Это может быть ситуация, когда вы вызываете контекст основного потока операций в фоновом потоке или контекст фонового потока в основном потоке действий.
Например, я обновил свою общую строку настроек следующим образом.
И вызвал finish () сразу после него. Теперь он выполняет коммит, выполняющийся в главном потоке, и останавливает любые другие асинхронные коммиты, если поступает, пока не завершится. Таким образом, его контекст жив, пока запись не завершена. Следовательно, предыдущий контекст является живым, вызывая ошибку.
Поэтому убедитесь, что ваш код перепроверен, если есть какой-то код, имеющий эту проблему контекста.
источник