Android Loader 機(jī)制淺談

一, 數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,388評(píng)論 25 708
  • Android開發(fā)者都經(jīng)歷過(guò)APP UI開發(fā)不當(dāng) 會(huì)造成overDraw,導(dǎo)致APP UI渲染過(guò)慢,但是很多人卻沒...
    Tamic閱讀 16,219評(píng)論 30 104
  • 1 背景## 在Android中任何耗時(shí)的操作都不能放在UI主線程中,所以耗時(shí)的操作都需要使用異步實(shí)現(xiàn)。同樣的,在...
    我是昵稱閱讀 1,360評(píng)論 0 3
  • PHP視頻教程全集下載-PHP視頻教程排行以及深度解析: 帶領(lǐng)我們一起走進(jìn)PHP的世界。 PHP是世界上最好的編程...
    dagailv閱讀 296評(píng)論 0 0
  • 敏感度是生活的細(xì)節(jié)?!皞ゴ蟮念^腦談?wù)撓敕?,中等的頭腦談?wù)撌录?,弱小的頭腦談?wù)撊?/div>
    92新元閱讀 458評(píng)論 0 0

友情鏈接更多精彩內(nèi)容