簡體   English   中英

Android Fragment isAdded 在 onResume 方法中發布線程后返回 false 並且 getActivity 為 null

[英]Android Fragment isAdded returns false and getActivity is null after posting thread in the onResume method

所以我在我的應用程序的主要活動中使用導航,我有一個片段,它是我的開始導航片段。

在這個片段中,創建之后,在我的演示者中,我發布了一個線程來從網絡中獲取數據。 獲取數據后,我使用主線程將數據顯示到我的屏幕上。

該應用程序第一次運行時,運行良好。

但是,如果用戶打開抽屜並再次選擇這個片段而不是另一個片段,片段將再次重新創建,這意味着它會被銷毀並按照導航組件的設計從頭開始創建。

但是這一次,當我的演示者發布線程獲取數據線程並且這完成並將結果發送到 UI 時,片段的 isAdded() 方法返回 false 並且 getActivity 為 null。

有了這個,意味着我不能使用 Activity Context(getActivity() 為 null 或 requireActivity() 拋出非法狀態異常),因此我無法加載圖像等,因為我沒有可用的上下文。

我強調,當用戶在此片段可見時打開抽屜並再次選擇從抽屜導航到此片段時會發生這種情況。 如果用戶導航到另一個片段然后按下后退按鈕一切正常。

知道如何處理這個問題嗎?

片段和活動都應該被銷毀。 你永遠不能依賴 android 框架組件生命周期狀態,正因為如此,android 架構組件才被制作出來 例如,ViewModel 可以比它的宿主片段更長壽。

但是 - viewmodel/presenter/controller 不是執行網絡請求和處理應用程序邏輯的正確位置,只是因為這不是他們的工作(SOLID 的S單一職責)。

有應用程序架構的官方指南 簡單地說,您有一個用於 android 相關代碼的層,您可以在其中更新 UI,用於處理應用程序邏輯的層(獨立於 java/kotlin 和 android 框架)和用於請求/保存數據的層。 因此,在創建 ui 類期間,您會獲得視圖模型,該視圖模型引用了處理邏輯並將結果公開以在 ui 中呈現的類。 內層是持久的 - 視圖不是。

所以,經過測試和搜索,我發現了我上面描述的問題的根源。

我在我的 Fragment 的 onDestroy/onDetach 方法中取消了我的演示者的觀點。 但是,當創建替換 Fragment 時,這個新 Fragment 首先附加到調用 Activity 上,然后舊的 Fragment 被銷毀。

請記住,我將演示者注入到 Fragment 實例中,在附加新片段時,演示者將永遠不會為空,因此,考慮到我在演示者為空時創建了一個新的演示者實例,演示者實例正在注入片段的不知道新的“視圖”對象。

因此,當結果通過回調到達 UI 線程時,此視圖對象是“未添加”的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM