java.lang.IllegalStateException:API 响应后片段未附加到上下文

cpg*_*en2 3 java android android-fragments

在我的应用程序中,我有一个用于显示数据的片段,以及一个用于更改应用程序中某些设置的设置活动。当我通过导航抽屉进入设置活动,然后返回主屏幕(不更改设置)时,应用程序崩溃并出现以下异常:

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

它似乎是在 API 调用的响应之后发生的,并且从关于 SO 的另一个答案中可以很好地解释原因,但是我尝试过的任何方法都无法解决这个问题。

我已经看到了其他几个关于此的问题,但是我无法将这些答案应用于我的情况。我尝试检查 isAttached() 并且没有帮助,并且对片段进行空检查,但它仍然得到相同的异常

不是发布所有类,其中一些很长,这里是 github repo。通过 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)
Run Code Online (Sandbox Code Playgroud)

ian*_*ake 5

您需要调用unregisterOnSharedPreferenceChangeListener()您的onDestroyView()( 的镜像onCreateView(),这是您注册侦听器的位置)。

就像现在一样,您正在泄漏您的 Fragment 作为SharedPreferences对您的侦听器的强引用,onSharedPreferenceChanged在您的 Fragment 的视图被销毁后继续向其发送回调,从而导致您收到错误消息。