java.lang.IllegalStateException: фрагмент не привязан к контексту после ответа API - PullRequest
0 голосов
/ 09 июля 2019

В моем приложении есть фрагмент, который я использую для отображения данных, и действие «Настройки», которое я использую для изменения некоторых настроек в приложении.Когда я перехожу к действиям с настройками через панель навигации, а затем возвращаюсь к главному экрану (без изменения настроек), приложение вылетает с таким исключением:

java.lang.IllegalStateException: Fragment NowWeatherFragment{b7914f8 (0e67ee0d-8776-45b5-9fd7-ee69841c31d1)} not attached to a context

Кажется,происходило после ответа от вызова API, и было достойное объяснение, почему из другого ответа на SO, но ничего, что я пробовал, не смогло это исправить.

Я видел несколько других вопросов оэто, но у меня проблемы с применением ответов на них в моей ситуации.Я попытался проверить isAttached (), но это не помогло, а также проверил нулевую проверку фрагмента, но он все еще получает то же исключение

Вместо публикации всех классов, некоторые из которых оченьдолго, вот репозиторий GitHub.Оно должно быть довольно легким и простым для запуска на устройстве через Android Studio https://github.com/jollygreenegiant/SimpleWeather

Я ожидаю, что приложение просто вернется на главный экран и отобразит данные о погоде, как при запуске.

Вот полная трассировка стека:

java.lang.IllegalStateException: Fragment NowWeatherFragment{b7914f8 (0e67ee0d-8776-45b5-9fd7-ee69841c31d1)} not attached to a context.
        at androidx.fragment.app.Fragment.requireContext(Fragment.java:765)
        at androidx.fragment.app.Fragment.getResources(Fragment.java:829)
        at com.jggdevelopment.simpleweather.fragments.NowWeatherFragment.setupViews(NowWeatherFragment.java:82)
        at com.jggdevelopment.simpleweather.fragments.NowWeatherFragment$3.onSharedPreferenceChanged(NowWeatherFragment.java:152)
        at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:612)
        at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:598)
        at com.jggdevelopment.simpleweather.fragments.MasterFragment.updateConditions(MasterFragment.java:263)
        at com.jggdevelopment.simpleweather.services.WeatherAPIUtils$2.onResponse(WeatherAPIUtils.java:92)
        at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7319)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934)

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Вам нужно позвонить unregisterOnSharedPreferenceChangeListener() в ваш onDestroyView() (зеркало onCreateView(), где вы регистрируете слушателя).

Как и сейчас, вывы просачиваете свой фрагмент, поскольку SharedPreferences содержит сильную ссылку на вашего слушателя, продолжая посылать ему обратные вызовы на его onSharedPreferenceChanged задолго до того, как представление вашего фрагмента будет уничтожено, вызывая сообщение об ошибке, которое вы получаете.

0 голосов
/ 09 июля 2019

Жизненный цикл фрагмента слишком сложен

Activity myactivity = getActivity(); 
if (isAdded() && myactivity != null) {
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...