2015-11-04 55 views
1

我有存儲在應用程序類的數組列表中的視圖模型。所以即使活動因爲旋轉而被破壞,它們的生命期也會繼續(但是一旦isFinishing爲true,那麼視圖模型實例將從列表中移除並停止存在)。在異步調用完成之前按下後退按鈕會發生什麼?

我也有數據服務單例,視圖模型也使用無限期地生活。所以,如果我使用ANKO異步塊在我的視圖模型開始一個異步調用,即

async { 
    val data = DataService.instance.getData() 

    uiThread { 
     if (data != null) { 
      //do something 
     } 
    } 
} 

如果用戶在調用完成之前按下後退按鈕會發生什麼? IsFinishing將是真實的,我的視圖模型實例將不再存在。請問異步調用異常,當它返回或將它優雅地死亡?

回答

1

如果底層活動/片段上下文已被垃圾收集,則uiThread調用中的代碼將不會執行。異步調用中的uiThread調用將對上下文保留WeakReference,所以經常遇到的上下文內存泄漏不會發生。詳情here

+0

所以我猜這意味着異步{ui {}}應該總是在活動和/或片段上編碼?如果在調用返回之前發生旋轉,uiThread會執行嗎? –

+0

是的,使用uiThread,除非可以獨立於活動/片段保存異步執行的結果。當設備旋轉時,活動被重新創建,所以uiThread中的代碼將不會執行。 – davehenry

+0

請注意,如果您在一個片段中執行此操作,您仍然需要檢查片段是否實際連接,即如果'activity!= null'。這是因爲碎片可能已經分離,但不會收集垃圾。 –

0

我想它會優雅地死去。你可以寫一個小的測試程序,在其中調試行爲。不過,我強烈建議保留一個引用/指向異步任務的指針,並在按下後退按鈕時將其終止。如果您不需要結果/無法處理結果,則無需讓它在後臺運行。

相關問題