android loader使用 - AsyncTaskLoader vs AsyncTask




api example (5)

由於Honeycombv4 Compatibility Library可以使用AsyncTaskLoader 。 據我所知, AsyncTaskLoader可以通過像屏幕翻轉之類的配置更改而生存下來。

建議使用AsyncTaskLoader而不是AsyncTaskLoaderManager是否也在圖片中?

但是我還沒有找到任何關於如何正確使用AsyncTaskLoader好例子。 文檔也沒有提供任何示例。 誰能提供一些很好的例子。


Answers

AsyncTaskLoader執行與AsyncTask相同的功能,但稍微好一點。 它可以更輕鬆地處理活動配置更改,並且它在碎片和活動的生命週期內運行。 好的是,AsyncTaskLoader可以用於任何使用AsyncTask的情況。 無論何時,需要將數據加載到內存中以供Activity / Fragment處理,AsyncTaskLoader可以更好地完成這項工作。

雖然使用AsyncTasks有幾個問題:

  • 配置更改可能會造成混亂
  • 暫停一個活動不會暫停AsyncTask
  • 大量的樣板代碼(這意味著更多可能的錯誤)

AsyncTaskLoader文檔


當比較AsyncTaskLoaderAsyncTask時 ,您可能會知道何時旋轉設備屏幕,它可能會破壞並重新創建您的活動,以便在網絡交易正在進行時讓圖像旋轉您的設備:

AsyncTask會再次作為後台線程執行,而前一個後台線程處理只是多餘的殭屍。

AsyncTaskLoader只會基於在Loader Manager中註冊的Loader ID重新使用,因此請避免重新執行網絡事務。

總之, AsyncTaskLoader防止後台線程的重複並消除殭屍活動的重複。


除了其他答案中描述的一些差異:

通過AsyncTask使用AsyncTaskLoader時:

  • AsyncTaskLoader使我們可以自由地加載舊的緩存數據,直到forceLoad()返回新數據

  • 我們可以通過setUpdateThrottle()來設置AsyncTaskLoader的延遲,這可以防止客戶端的連續更新(Activity / Fragment)

  • 如果AsyncTaskLoader具有共同的父活動,並且它是從getActivity().getSupportLoaderManager()開始的,則它可以共享到多個片段getActivity().getSupportLoaderManager()

  • LoaderManger的鏈接活動不再可用時, AsyncTaskLoader將被銷毀。 而我們需要手動銷毀AsyncTasks,如果其調用者的活動破壞。 這節省了我們編寫所有結算資料的時間。 AsyncTaskLoader在各自的生命週期中表現良好。

所以,AsyncTaskLoader比AsyncTask更好。


您可以查看兼容性庫的源代碼以獲取更多信息。 FragmentActivity功能是:

  • 保留LoaderManager的列表
  • 通過使用onRetainNonConfigurationInstance()保存實例,確保它們在您翻動手機(或發生其他配置更改)時不會被破壞
  • 在您的Activity中調用initLoader()時踢出右側的加載器

您需要使用LoaderManager來與加載器進行LoaderManager ,並提供所需的回調來創建加載器並使用它們返回的數據填充您的視圖。

一般來說,它應該比管理AsyncTask自己更容易。 但是, AsyncTaskLoader並沒有完全記錄在案,因此您應該在文檔中研究示例並/或在CursorLoader之後為您的代碼建模。


使用較低的gradle版本解決了它

dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0'

那將是必須要做的





android android-asynctask android-loadermanager