大家好,我是蒼王。
以下是我這個系列的相關文章,有興趣可以參考一下,可以給個喜歡或者關注我的文章。
[Android]如何做一個崩潰率少于千分之三噶應用app--章節列表
相信有關注我的人,都會看過我上一編介紹的Todo-mvp源碼體驗,這是基礎編。
這個系列的課程適合研發有Android有一年半左右的同學參考。
今天介紹的TODO-MVP-Loaders是Todo-mvp的進階編。
可以對比一下這兩個結構的圖
對比兩個圖,可以看出會多出一個LOADER的加載模塊,這個loader的作用是用來做什么呢?
loader是android 3.0后的一種異步數據加載機制,中文意思系加載器,可以理解為將我們想要的數據加載到一個相應的容器里面,即使Activity或者Fragment的周期中被打斷,也不用利用的機制恢復現場,直接使用Loader的機制。
這里TODO-MVP-Loaders里面的設計關系圖示
這里就是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:
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時自動重連接(自己特有的)
查看里面的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,也可以掃碼進群。我在這里期待你們的加入!!!