2013-05-28 47 views
2

什麼是通知執行一些後臺處理的片段的託管活動的重建方法,它完成了什麼。假設碎片正在運行一些正在主循環之外工作的線程。在片段中通知處理信息的活動

一個簡單的回調不會做,因爲:

  • 的活動可以被分離,由於屏幕旋轉,這將導致到一個NullPointerException。
  • 來自活動內部的投票只是愚蠢的
  • 只附加調用該活動一次,並讓每個onCreate調用後(即由於屏幕旋轉)檢查活動。
  • 我目前的工作,但它似乎是錯誤的:每當片段被連接,它會檢查工作是否完成,並通過回調通知活動。如果片段完成工作,它也會回調活動(如果附加)。

爲什麼我認爲是錯的?因爲我有一些非常難看的方法來檢查片段是否被連接,並且如果工作完成以便可能調用回調。當在片段中執行一些工作期間引發異常並且活動被分離時,這變得非常愚蠢。如果android決定在同一時刻調用onSaveInstance,則必須將該Exception放入Bundle中,並在Activity和fragment從保存狀態重新創建時稍後傳遞。此外,我可以遇到這樣一種情況,即一次活動將收到兩次相同的回調(一次是檢查碎片,另一次是碎片被連接;這可能會在應用程序保存並恢復時發生)

這會生成在我的選擇中,許多代碼可能會更清楚,如果活動不會分離。這就是爲什麼我希望我做錯了什麼,希望有人能爲我提供更好的解決方案。

+0

儘管我不知道你到底想要實現什麼。也許您的答案是將服務實現爲「您的主要活動」,這樣可以確保您的服務始終處於運行狀態,並且您可以隨時通過服務通知服務,從片段完成某些工作。 – Mario

+0

片段運行時間爲5秒。我不想爲每一個做一些背景工作的片段都提供服務。 – Chris

+0

您不需要爲每個片段提供服務,而只需要每個片段通知的服務。 – Mario

回答

2

我會說你應該使用一個服務爲你的後臺處理,但如果你選擇了一個特定的原因片段,你可以堅持下去。您應該通過一個BroadcastReceiver來通知活動來自可能與活動有不同生命週期的片段或服務。使用這種方法,活動可以在其自己的生命週期回調期間通過registerunregister BroadcastReceiver。從片段或服務你只是send the broadcast,並忘記它。如果一個活動正在監聽廣播,它將收到它,如果不是什麼都不會發生。

+0

我忘記了廣播系統。重組我的代碼後,我總是同意你的看法。我之所以沒有使用它,是因爲我以一種使用廣播的方式組織了我的片段,使用起來非常痛苦。謝謝 – Chris