0

問題:從長時間運行的任務到活動報告進度/完成的最佳做法是什麼?當活動處於後臺/方向更改時發生進度/完成報告時該怎麼辦?長時間運行任務,回調活動或片段

現實生活中的示例: 活動使網絡調用從服務器獲取數據(這可能需要10秒以上)。 完成此網絡通話後,應通知活動並且活動應顯示網絡通話已完成。

只要應用程序保持打開狀態,這很容易實現。我的問題是,如果在應用程序在後臺完成網絡調用時該怎麼辦(活動將會錯過任何回調)。

我一直在看下面的方法可以做到這一點,但我不能決定該怎麼做:

  • 服務的滋生其中執行網絡調用線程。服務綁定到活動。在網絡通話完成時,向該活動提供服務回調。如果Activity在後臺進行回調時處於後臺(因此Activity未命中回調),Activity是否應該對Service進行輪詢以獲取保存的數據? (做什麼,如果活動錯過這個廣播,因爲它是在後臺?)
  • IntentService是廣播網絡時,通話結束後的數據
  • 的AsyncTask,但壞就壞在活動是在後臺等

我應該如何解決這個問題?

回答

0

我已經使用HeadlessFragments來解決這個問題。 This博客文章詳細解釋瞭如何實現它,並且您提到的問題由它處理。

編輯: 對於註釋的問題:

  1. 爲了您的具體問題,有關回調丟失時Activity是在後臺,答案是否定的。處於「背景」意味着Activity仍然活着。從我發佈的鏈接中,callback(即Activity本身)在與Activity脫離時即Activitydestroyed時被刪除。所以,如果你的Activity在後臺,而不是destroyed,它仍然會得到callback,並在callback中做任何你所做的事情。雖然Android可以殺死paused的活動,但在這種情況下,您的Activity將是destroyed,並且您將不會獲得callback。在這種情況下,您可以將從服務器獲取的數據保存在永久性存儲器中,如SQLite,並且可以在創建Activity時阻止進行其他網絡呼叫或進行網絡呼叫,這將確保無論何時Activitycreated,將有數據顯示(當然,電話會通過)。

  2. Fragment的使用專門用於處理您在問題中提到的配置更改。正在運行的任務仍由AsyncTask而不是Fragment完成。 Fragment僅保存對該對象的引用。所以,我認爲它不是「最佳實踐」。

+0

感謝您的鏈接。我有兩個問題: 如果任務在活動在後臺完成,該怎麼辦?那麼所有的回調都會被錯過,對吧?當活動在後臺時,如何獲取從服務器檢索到的數據? 它似乎不是一個「最佳實踐」使用片段運行任務? 雖然我確實看到了這個方法的重點。 編輯:我應該將數據存儲在HeadlessFragment中,然後如果「TaskHasFinished」請求片段中的數據? –

+0

@JonasJensen請參閱編輯回答你的問題。 – Nerd