你們好,我是蒼王。
html
如下是我這個系列的相關文章,有興趣能夠參考一下,能夠給個喜歡或者關注個人文章。android
[Android]如何作一個崩潰率少於千分之三噶應用app--章節列表架構
相信有關注個人人,都會看過我上一編介紹的Todo-mvp源碼體驗,這是基礎編。app
這個系列的課程適合研發有Android有一年半左右的同窗參考。異步
今天介紹的TODO-MVP-Loaders是Todo-mvp的進階編。async
能夠對比一下這兩個結構的圖ide
對比兩個圖,能夠看出會多出一個LOADER的加載模塊,這個loader的做用是用來作什麼呢?函數
loader是android 3.0後的一種異步數據加載機制,中文意思系加載器,能夠理解爲將咱們想要的數據加載到一個相應的容器裏面,即便Activity或者Fragment的週期中被打斷,也不用利用的機制恢復現場,直接使用Loader的機制。組件化
這裏TODO-MVP-Loaders裏面的設計關係圖示post
這裏就是TaskLoader的觸發運行原理了。每個Activity/Fragment都有一個LoaderManager,並且只有這個LoaderManager能夠管理與Actvity/Fragment相關聯的Loader,Fragment調用的LoaderManager實際上也仍是依附的Activity裏面的。
LoaderManger生命週期和Activity和Fragment的生命週期是有關聯的。
想深刻了解LoaderManager和Loader生命週期,能夠閱讀深刻源碼解析Android中Loader、AsyncTaskLoader、CursorLoader、LoaderManager。
這個MVP的架構關鍵點固然就是loader了,不少入門不久的Android工程師,不必定會接觸過loader。
從查看源碼中咱們能夠看到裏面調用TaskLoader
看一下Google官網對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的配置改變帶來的影響
google文檔中關於Loader的說法:
Introduced in Android 3.0, loaders make it easy to asynchronously load data in an activity or fragment. Loaders have these characteristics:
一、They are available to every Activity and Fragment. //支持Activity和Fragment
二、They provide asynchronous loading of data. //異步加載(就是異步任務來完成的)
三、They monitor the source of their data and deliver new results when the content changes. //當數據源改變時能及時通知客戶端(本身特有的)
四、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時自動重鏈接(本身特有的)
查看裏面的AsyncTaskLoader的源碼,其繼承於Loader,裏面內部類是一個AsyncTask實現runnable的接口,用於單一任務,<D>用於基礎的單一任務類,在TaskLoader裏面是輸入Task的對象。
圖示如
TaskLoader是繼承於的AsyncTaskLoader,而後AsyncTaskLoader包含了本身的AsyncTask,AsyncTaskLoader繼承於Loader對象,而Activity/Fragment是經過LoaderManager來管理Loader。
首先構造函數中添加數據源的引用。其次重寫以下方法
loadInBackground:主要是進行異步加載數據的,在其中,我將數據源的數據return出來了。
mRepostory上一節也有提到,是數據源獲取的統一接口。TaskLoader初始化的時候也初始化。
deliverResult:則是真正的返回數據。
如下爲一對。
onStartLoading:生命週期,在建立時成立。
onStopLoading:生命週期,在結束時調用。
onReset:重置
這裏TaskLoader還加入了TasksRepository.TasksRepositoryObserver的接口onTasksChanged
那何時開始咱們會啓動咱們的TaskLoader呢?
首先要加載LoaderManager
而後再Fragment onResume中初始化Presenter
而後經過LoaderManager.LoaderCallbacks建立loader使用自定義的TaskLoader
而後再onLoadFinished中加載已經完成的數據。
使用這個優點在於
1.能夠異步加載數據,並監聽數據變化。
2.LoaderManager是Activity/Fragment內置的,並且使用v4的庫就能夠兼容
3.就算Activity/Fragment發生configuration change時自動重鏈接
4.任務能夠是使用對象封裝
對TODO-MVP-Loaders的介紹就到這裏
下一節,將會介紹todo-databinding,敬請期待。
我創建了一個關於Android架構學習的羣,裏面能夠進一步進行組件化學習和架構思想的的交流。
羣號是316556016,也能夠掃碼進羣。我在這裏期待大家的加入!!!