一, 數(shù)據(jù)訪問的常用模式
大家都知道在android里訪問數(shù)據(jù),以及一些耗時(shí)的操作是不能放在主線程去做的,所以我們都知道使用異步的。有關(guān)異步加載數(shù)據(jù)常用的有以下幾種

備注: 以上我是總結(jié)出來(lái)目前市場(chǎng)上常用的異步加載處理模式。
二, Android Loader的優(yōu)點(diǎn)
Android Loader簡(jiǎn)介:
Android的裝載器(loader)是從Android 3.0新引入的API , 主要完成單線程耗時(shí)數(shù)據(jù)異步裝載功能,并在數(shù)據(jù)有更新自動(dòng)通知UI刷新的作用。業(yè)內(nèi)也叫加載器,裝載機(jī),Loader一般用在Activity和fragment異步加載數(shù)據(jù),無(wú)需重新啟動(dòng)一個(gè)線程來(lái)執(zhí)行數(shù)據(jù)加載,異步加載可以用asyncTask 但是loader自帶數(shù)據(jù)結(jié)果監(jiān)聽機(jī)制,可以進(jìn)行UI更新。
官方介紹:
A class that performs asynchronous loading of data. While Loaders are active they should monitor the source of their data and deliver new results when the contents change. SeeLoaderManagerfor more detail.
Android Loader 優(yōu)點(diǎn):
適用于任何Activity和Fragment;
提供了異步加載數(shù)據(jù)的機(jī)制;
檢測(cè)數(shù)據(jù)源,當(dāng)數(shù)據(jù)源內(nèi)容改變時(shí)它們能夠傳遞新的結(jié)果;
當(dāng)配置改變后需要重新創(chuàng)建時(shí),它們會(huì)重新連接到最后一個(gè)loader的游標(biāo)。這樣,它們不需要重新查詢它們的數(shù)據(jù)。
在Activity配置發(fā)生變化(如橫豎屏切換)>時(shí)不用重復(fù)加載數(shù)據(jù)
三, Android Loader架構(gòu)
Loader
只是一個(gè)實(shí)例,一個(gè)執(zhí)行體。他依賴于loaderManager的管理。LoaderManager擔(dān)起對(duì)loader的管理,肩負(fù)起fragement
和activity之間如何在loader之間貫穿起來(lái)。有人說(shuō)LoaderManager是一個(gè)抽象類,里面定義了各種方法。而官方文檔則稱
LoaderMagaer是一個(gè)接口。其實(shí)不去在意這些定義。我們明顯可以感覺到。Loader的創(chuàng)建,使用,銷毀肯定都是LoaderManager去
定義的。一個(gè)LoaderManager可以管理多個(gè)loader。另外,loader的實(shí)現(xiàn)不會(huì)自己去實(shí)現(xiàn)而是委托自己的子類去實(shí)現(xiàn)。
AsyncTaskLoader 和 CursorLoader

四,AsyncTaskLoader 詳解
AsyncTaskLoader是loader的一個(gè)子類。是一個(gè)抽象類。提供了AsyncTask。
Publick的方法如下圖:

更多:https://developer.android.com/reference/android/content/AsyncTaskLoader.html
五,AsyncTaskLoader Demo
以獲取當(dāng)前手機(jī)安裝成功的app為例,講關(guān)鍵代碼:
新建一個(gè)loader繼承AsyncTaskLoader:

把loader傳給app的實(shí)體類通過(guò)構(gòu)造函數(shù)把loader拿到然后獲取app的icon:

在自己創(chuàng)建的appadapter里面設(shè)置需要的icon和label

說(shuō)明:demo是基于官方寫的,完美體現(xiàn)了AsyncTaskLoader的加載和及時(shí)刷新的效果??梢孕遁d一個(gè)程序,demo會(huì)立馬自己刷新數(shù)據(jù)展現(xiàn)。
AppListFragment會(huì)實(shí)現(xiàn)loader的callback接口實(shí)現(xiàn)onLoaderReset方法刷新頁(yè)面數(shù)據(jù)。有需要的可以私我要完整demo
Demo效果:

六,CursorLoader 詳解
CursorLoader又是AysncTaskLoader的一個(gè)子類。查詢ContentResolve并且返回一個(gè)Cursor。可以說(shuō)CursorLoader
是一個(gè)很牛的查詢工具。以一種標(biāo)準(zhǔn)的方式實(shí)現(xiàn)了loader的接口。

相對(duì)于AysncTaskLoader的實(shí)例demo簡(jiǎn)單些,只是對(duì)手機(jī)通訊錄做個(gè)查詢展現(xiàn):

查詢耗時(shí)的操作直接放到onLoadInBackground方法里做但是這里只是返回了一個(gè)cursor。處理要onLoadFinish里做:

說(shuō)明:同樣如果有刪除,更新操作會(huì)在onLoaderReset里面實(shí)現(xiàn)。具體demo可以私下找我要
網(wǎng)上有很多關(guān)于loader的資料,本人只建議去看官網(wǎng),官網(wǎng)更全面:
https://developer.android.com/reference/android/content/Loader.html