一往扔, 數(shù)據(jù)訪問的常用模式
大家都知道在android里訪問數(shù)據(jù)逾礁,以及一些耗時的操作是不能放在主線程去做的移宅,所以我們都知道使用異步的鲫售。有關(guān)異步加載數(shù)據(jù)常用的有以下幾種
備注: 以上我是總結(jié)出來目前市場上常用的異步加載處理模式硝拧。
二径筏, Android Loader的優(yōu)點(diǎn)
Android Loader簡介:
Android的裝載器(loader)是從Android 3.0新引入的API , 主要完成單線程耗時數(shù)據(jù)異步裝載功能,并在數(shù)據(jù)有更新自動通知UI刷新的作用障陶。業(yè)內(nèi)也叫加載器滋恬,裝載機(jī),Loader一般用在Activity和fragment異步加載數(shù)據(jù)抱究,無需重新啟動一個線程來執(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ī)制;
檢測數(shù)據(jù)源妈候,當(dāng)數(shù)據(jù)源內(nèi)容改變時它們能夠傳遞新的結(jié)果指黎;
當(dāng)配置改變后需要重新創(chuàng)建時,它們會重新連接到最后一個loader的游標(biāo)州丹。這樣醋安,它們不需要重新查詢它們的數(shù)據(jù)。
在Activity配置發(fā)生變化(如橫豎屏切換)>時不用重復(fù)加載數(shù)據(jù)
三墓毒, Android Loader架構(gòu)
Loader
只是一個實(shí)例吓揪,一個執(zhí)行體。他依賴于loaderManager的管理所计。LoaderManager擔(dān)起對loader的管理柠辞,肩負(fù)起fragement
和activity之間如何在loader之間貫穿起來。有人說LoaderManager是一個抽象類主胧,里面定義了各種方法叭首。而官方文檔則稱
LoaderMagaer是一個接口习勤。其實(shí)不去在意這些定義。我們明顯可以感覺到焙格。Loader的創(chuàng)建图毕,使用,銷毀肯定都是LoaderManager去
定義的眷唉。一個LoaderManager可以管理多個loader予颤。另外,loader的實(shí)現(xiàn)不會自己去實(shí)現(xiàn)而是委托自己的子類去實(shí)現(xiàn)冬阳。
AsyncTaskLoader 和 CursorLoader
四蛤虐,AsyncTaskLoader 詳解
AsyncTaskLoader是loader的一個子類。是一個抽象類肝陪。提供了AsyncTask驳庭。
Publick的方法如下圖:
更多:https://developer.android.com/reference/android/content/AsyncTaskLoader.html
五,AsyncTaskLoader Demo
以獲取當(dāng)前手機(jī)安裝成功的app為例氯窍,講關(guān)鍵代碼:
新建一個loader繼承AsyncTaskLoader:
把loader傳給app的實(shí)體類通過構(gòu)造函數(shù)把loader拿到然后獲取app的icon:
在自己創(chuàng)建的appadapter里面設(shè)置需要的icon和label
說明:demo是基于官方寫的饲常,完美體現(xiàn)了AsyncTaskLoader的加載和及時刷新的效果≤衤浚可以卸載一個程序,demo會立馬自己刷新數(shù)據(jù)展現(xiàn)贯城。
AppListFragment會實(shí)現(xiàn)loader的callback接口實(shí)現(xiàn)onLoaderReset方法刷新頁面數(shù)據(jù)熊楼。有需要的可以私我要完整demo
Demo效果:
六,CursorLoader 詳解
CursorLoader又是AysncTaskLoader的一個子類能犯。查詢ContentResolve并且返回一個Cursor鲫骗。可以說CursorLoader
是一個很牛的查詢工具踩晶。以一種標(biāo)準(zhǔn)的方式實(shí)現(xiàn)了loader的接口执泰。
相對于AysncTaskLoader的實(shí)例demo簡單些,只是對手機(jī)通訊錄做個查詢展現(xiàn):
查詢耗時的操作直接放到onLoadInBackground方法里做但是這里只是返回了一個cursor渡蜻。處理要onLoadFinish里做:
說明:同樣如果有刪除术吝,更新操作會在onLoaderReset里面實(shí)現(xiàn)。具體demo可以私下找我要
網(wǎng)上有很多關(guān)于loader的資料茸苇,本人只建議去看官網(wǎng)排苍,官網(wǎng)更全面:
https://developer.android.com/reference/android/content/Loader.html