繁体   English   中英

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

[英]java.lang.IllegalStateException: Fragment not attached to a context after API response

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

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)

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

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

片段生命周期过于复杂

Activity myactivity = getActivity(); 
if (isAdded() && myactivity != null) {
...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM