在我的应用程序中,我有一个片段用于显示数据,还有一个设置活动,用于更改应用程序中的某些设置。当我通过导航抽屉进入设置活动,然后返回主屏幕(不更改设置)时,应用程序崩溃,但出现以下异常:
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)
答案 0 :(得分:2)
您需要在onDestroyView()
(注册监听器的onCreateView()
的镜像)中调用unregisterOnSharedPreferenceChangeListener()
。
现在,您正在泄漏Fragment,因为SharedPreferences
拥有对监听器的强大引用,在Fragment的视图被破坏之后,继续向其onSharedPreferenceChanged
发送回调函数,导致错误消息。
答案 1 :(得分:0)
片段生命周期太复杂了
Activity myactivity = getActivity();
if (isAdded() && myactivity != null) {
...
}