2016-10-04 54 views
2

我想執行相對較短(最多2-3秒)的背景任務,同時向用戶顯示ProgressDialog(我想在任務開始時顯示ProgressDialog並在最後解除它)。什麼是在後臺工作中處理配置更改的最新方法?

我已經嘗試了幾種方法,但他們都有缺點,我無法正確解決。

我曾嘗試:

  • AsyncTask

    的內存泄漏問題可以通過使用來解決一個WeakReference(持有參考Activity),但我不能叫回新的Activity實例是否在任務運行時重新創建實例(例如在方向更改的情況下)。

  • AsyncTask裹着一具無頭Fragment

    Commiting的onCreate()Fragment交易經常給我Can not perform this action after onSaveInstanceStateIllegalStateException。使用commitAllowingStateLoss()感覺不太合適。

    onCreate()中加入Fragment意味着即使我根本不需要它,它也會附加到Activity,這感覺就像一個巨大的矯枉過正。

    這是一個痛苦的屁股實施,例如,如果我有幾個AsyncTask s。我必須創建一個巨大的Fragment,其中包含幾個AsyncTask內部類,這種感覺不對,或者爲每個任務創建單獨的Fragments,這很難管理並導致代碼混淆。

  • IntentService + LocalBroadcastManager

    我的這種方法的問題是,即使我登記我的接收器儘可能早地(在onCreate(),並註銷其在onDestroy()),它仍然是可能的方向在廣播來在onDestroy()之後和onCreate()之後改變,,所以我想念廣播。

    (持久廣播已被棄用,不應該根據谷歌使用)

我真的不明白,爲什麼谷歌是那麼的難來處理配置更改。

我應該如何正確地做到這一點?

在此先感謝。

回答

4

RxJava是一種矯枉過正只是在做後臺工作,並沒有真正解決在原崗位提到的問題。 任何需要在後臺運行並保留的東西我最喜歡的方法是Loader。這被設計爲具有生命週期意識,很容易重新綁定新的活動,並且結果將立即或在重新綁定後立即傳遞(從不停止或在重新創建期間)。

這不會解決片段狀態丟失問題,如果您需要更改片段以響應異步工作,則不存在通用方法來解決此問題。請使用CommitAllowingStateLoss並確保您在下一個簡歷中修改狀態,或者更改設計,以便內聯顯示進度(請參閱Dianne Hackborn的評論here

0

的AsyncTask是很老美特殊,你應該使用rxJava庫組織併發工作。有了它,你可以在一個線程上開始工作,在另一個線程上工作,並在其他線程上處理結果。它也有兩個默認線程池,您可以在單個線程上完成所有任務。 活動和片段只是一個UI,順便說一下,它取決於屏幕方向和設備狀態(應用程序可見或最小化)。 IntentService允許執行後臺任務,並擁有自己的後臺線程,但是,一旦工作完成,它將被停止。 所以,如果我說得對,您需要通過發送來自IntentService的廣播來通知您的活動有關yask狀態。 有一個更好的解決方案 - 您可以先啓動普通服務,然後將活動綁定到它。在綁定過程中,您將獲得您的服務界面,並且可以直接訪問服務。 Inside Service通過使用rxJava庫來組織後臺任務。 請參閱本教程第4章來熟悉併發特性:https://github.com/Froussios/Intro-To-RxJava

相關問題