簡體   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