关于loader asyncTaskLoader AsyncTask的理解
在statckOverflow里查了一下,說是 AsyncTaskLoader不需要寫代碼來處理activiy 配置(系統字體大小,orientation,輸入設備類型等都叫做activity的配置)變化帶來的影響,但是缺點是加載時候不能解散掉進度框,不能在onLoadFinished時切換fragment.單純的從load data?
角度考慮,AsyncTaskLoader更合適。
If you need UI changes after data is loaded - AsyncTask might server you better, especially if you are working with fragments, but remember to handle activity configuration changes.?
意思是說,你向數據加載完成之后ui改變,異步任務更適合,但是你需要寫代碼去處理activity的配置改變帶來的影響。
AsyncTaskLoader是基于AsyncTask的?
AsyncTaskLoader有一個優點,他不僅可以異步(通俗理解就是又開了一個線程而已),并且當他檢測到數據的變化時會自動加載。
google文檔中關于Loader的說法:?
Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment. Loaders have these characteristics:?
1、They are available to every Activity and Fragment. //支持Activity和Fragment?
2、They provide asynchronous loading of data. //異步加載(就是異步任務來完成的)?
3、They monitor the source of their data and deliver new results when the content changes. //當數據源改變時能及時通知客戶端(自己特有的)?
4、They automatically reconnect to the last loader’s cursor when being recreated after a configuration change. Thus, they don’t need to re-query their data. //發生configuration change時自動重連接(自己特有的)
Loader由什么組成?
??總共有四個特性最終決定了一個Loader的行為:
-
執行異步載入的任務。為了確保在一個獨立線程中執行載入操作,Loader的子類必須繼承AsyncTaskLoader而不是Loader類。AsyncTaskLoader是一個抽象Loader,它提供了一個AsyncTask來做它的執行操作。當定義子類時,通過實現抽象方法loadInBackground方法來實現異步task。該方法將在一個工作線程中執行數據加載操作。
-
在一個注冊監聽器中接收載入完成返回的結果(見附注1)。對于每個Loader來說,LoaderManager注冊一個OnLoadCompleteListener,該對象將通過調用onLoadFinished(Loader loader, D result)方法使Loader將結果傳送給客戶端。Loader通過調用Loader#deliverResult(D result),將結果傳遞給已注冊的監聽器們。
-
三種不同狀態(見附注2)。任何Loader將處于三種狀態之中,已啟動、已停止、重啟:?
a. 處于已啟動狀態的Loader會執行載入操作,并在任何時間將結果傳遞到監聽器中。已啟動的Loader將會監聽數據改變,當檢測到改變時執行新的載入。一旦啟動,Loader將一直處在已啟動狀態,一直到轉換到已停止和重啟。這是唯一一種onLoadFinished永遠不會調用的狀態。?
b. 處于已停止狀態的Loader將會繼續監聽數據改變,但是不會將結果返回給客戶端。在已停止狀態,Loader可能被啟動或者重啟。?
c. 當Loader處于重啟狀態時,將不會執行新的載入操作,也不會發送新的結果集,也不會檢測數據變化。當一個Loader進入重啟狀態,它必須解除對應的數據引用,方便垃圾回收(同樣地,客戶端必須確定,在Loader無效之后,移除了所有該數據的引用)。通常,重啟Loader不會兩次調用;然而,在某些情況下他們可能會啟動,所以如果必要的話,它們必須能夠適時重啟。 -
有一個觀察者接受數據源改變的通知。Loader必須實現這些Observer其中之一(比如ContentObserver,BroadcastReceiver等),來檢測底層數據源的改變。當檢測到數據改變,觀察者必須調用Loader#onContentChanged()。在該方法中執行兩種不同操作:a. 如果Loader已經處于啟動狀態,就會執行一個新的載入操作; b. 設置一個flag標識數據源有改變,這樣當Loader再次啟動時,就知道應該重新載入數據了。
從以上我們大致就可以知道他們的區別所在了。
總結
以上是生活随笔為你收集整理的关于loader asyncTaskLoader AsyncTask的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Fragment、Tabhost和F
- 下一篇: 关于使用AsyncTaskLoader的