【问题标题】:java.lang.IllegalStateException: Fragment not attached to a context after API responsejava.lang.IllegalStateException:API 响应后片段未附加到上下文
【发布时间】:2019-07-09 04:49:25
【问题描述】:

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

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)

【问题讨论】:

标签: java android android-fragments


【解决方案1】:

你需要在你的onDestroyView()onCreateView()的镜像,你注册监听器的地方)调用unregisterOnSharedPreferenceChangeListener()

就像现在一样,您正在泄漏您的 Fragment,因为 SharedPreferences 持有对您的侦听器的强引用,在您的 Fragment 的视图被破坏后,继续向它的 onSharedPreferenceChanged 发送回调,从而导致错误消息您得到。

【讨论】:

  • 成功了,谢谢。你能详细说明一下“强”参考是什么意思吗?这与其他类型的参考文献有何不同?
  • @cpgreen2 - weak reference 仅在其他对象引用该对象时存在,确保该对象可以被垃圾回收。我使用强引用作为所有其他类型引用的简写——即使对象会被销毁,它也能保留该对象。
【解决方案2】:

Fragment 生命周期太复杂太复杂了

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

【讨论】:

  • 这实际上并不能解决导致它们在 Fragment 的视图首先被破坏后接收回调的内存泄漏。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多