2017-05-01 30 views
-2

我有一個大問題,幾天來一直困擾着我的應用。安卓應用中的片段生命週期問題

我在我的應用程序中使用默認的sidemenu佈局,並根據選擇哪個sidemenu項目用不同的片段替換內容視圖。

Description of setup

我只需撥打

getSupportFragmentManager().beginTransaction().replace().commit(); 

與內容視圖ID和新實例化的片段。

問題的發生是因爲網絡電話的使用靜態網絡管理器類,這些片段中燃煤,應用程序使用解析爲它的後端和運行在沒有任何用戶交互的後臺網絡請求。

我已經成功地通過關閉設備的wifi和3G將其從互聯網上切斷來複制問題,會發生什麼情況是,如果我在當前網絡請求正在進行時加載另一個片段,它看起來像舊的片段不會被銷燬,所以當網絡請求返回並更新了一些UI視圖時,視圖爲空,因爲我只能假設視圖綁定已經消失。

當在片段管理器上調用replace()時,不應該對相應片段和掛起的網絡調用進行垃圾收集。

我最初認爲這將歸結爲我用於網絡管理的靜態類,即執行的線程與片段不同,這意味着當片段被替換時,線程與網絡調用仍然存在,但不是如此,因爲將該類更改爲具體類並在片段內實例化它並不能解決問題。

我試過以下的東西,它們根本沒有幫助它。

  • 將靜態類更改爲具體類並實例化每個片段內的實例。
  • 拆卸碎片經理replace()調用.remove(oldFrag).add(newfrag)

這是一個非常大的問題,對我來說,所以如果任何更多經驗的Android開發者可以幫腔,我會很感激。

乾杯。

編輯 - 如果我能得到,爲什麼我的問題是正在downvoted它會走很長的路,以確保我提出更好的問題的一些反饋。

回答

0

請求是在單獨的線程中完成的,因此它們不受綁定到片段生命週期的影響,這就是爲什麼當它們完成時,片段被替換後,如果UI調用是在空值視圖上進行,肯定會引發異常。

我會建議,如果你的代碼可以引用這些請求,取消它們時onDestroy的片段被調用,這將阻止他們到達請求回調。或者,如果這樣做不起作用,只需使用布爾值來切換片段的狀態並在請求回調中使用該布爾值,以防止在代碼段被銷燬時執行UI代碼。

建議不要依賴垃圾收集,這是不透明的。

+0

謝謝!這實際上是非常有意義的。來自iOS開發,我只是假設在片段被銷燬後,回調不會被觸發。謝謝你的幫助。 – alexcatch