Android中的Loader有什么用

這篇“Android中的Loader有什么用”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android中的Loader有什么用”文章吧。

成都創(chuàng)新互聯(lián)是專業(yè)的梁平網(wǎng)站建設(shè)公司,梁平接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行梁平網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

一、Android裝載器基本方法

裝載器從android3.0開始引進(jìn)。它使得在activity或fragment中異步加載數(shù)據(jù)變得簡(jiǎn)單。裝載器具有如下特性:

  • 它們對(duì)每個(gè)Activity和Fragment都有效。

  • 他們提供了異步加載數(shù)據(jù)的能力。

  • 它們監(jiān)視數(shù)據(jù)源的一將一動(dòng)并在內(nèi)容改變時(shí)傳送新的結(jié)果。

  • 當(dāng)由于配置改變而被重新創(chuàng)建后,它們自動(dòng)重連到上一個(gè)加載器的游標(biāo),所以不必重新查詢數(shù)據(jù)。

裝載器API概述

在使用裝載器時(shí),會(huì)涉及很多類和接口們,我們?cè)谙卤碇袑?duì)它們總結(jié)一下:

Class/Interface

說明

LoaderManager一個(gè)抽像類,關(guān)聯(lián)到一個(gè)Activity或Fragment,管理一個(gè)或多個(gè)裝載器的實(shí)例。這幫助一個(gè)應(yīng)用管理那些與Activity或Fragment的生命周期相關(guān)的長時(shí)間運(yùn)行的的操作。最常見的方式是與一個(gè)CursorLoader一起使用,然而應(yīng)用是可以隨便寫它們自己的裝載器以加載其它類型的數(shù)據(jù)。

每個(gè)activity或fragment只有一個(gè)LoaderManager。但是一個(gè)LoaderManager可以擁有多個(gè)裝載器。LoaderManager.LoaderCallbacks一個(gè)用于客戶端與LoaderManager交互的回調(diào)接口。例如,你使用回調(diào)方法onCreateLoader()來創(chuàng)建一個(gè)新的裝載器。

Loader(裝載器)

一個(gè)執(zhí)行異步數(shù)據(jù)加載的抽象類。它是加載器的基類。你可以使用典型的CursorLoader,但是你也可以實(shí)現(xiàn)你自己的子類。一旦裝載器被激活,它們將監(jiān)視它們的數(shù)據(jù)源并且在數(shù)據(jù)改變時(shí)發(fā)送新的結(jié)果。AsyncTaskLoader提供一個(gè)AsyncTask來執(zhí)行異步加載工作的抽象類。CursorLoaderAsyncTaskLoader的子類,它查詢ContentResolver然后返回一個(gè)Cursor。這個(gè)類為查詢cursor以標(biāo)準(zhǔn)的方式實(shí)現(xiàn)了裝載器的協(xié)議,它的游標(biāo)查詢是通過AsyncTaskLoader在后臺(tái)線程中執(zhí)行,從而不會(huì)阻塞界面。使用這個(gè)裝載器是從一個(gè)ContentProvider異步加載數(shù)據(jù)的***方式。相比之下,通過fragment或activity的API來執(zhí)行一個(gè)被管理的查詢就不行了。

二、啟動(dòng)一個(gè)裝載器

LoaderManager管理一個(gè)Activiry或Fragment中的一個(gè)或多個(gè)裝載器.但每個(gè)activity或fragment只擁有一個(gè)LoaderManager.

你通常要在activity的onCreate()方法中或fragment的onActivityCreated()方法中初始化一個(gè)裝載器.你可以如下創(chuàng)建:

// 準(zhǔn)備裝載器.可以重連一個(gè)已經(jīng)存在的也可以啟動(dòng)一個(gè)新的. getLoaderManager().initLoader(0,null, this);

initLoader()方法有以下參數(shù):

  • 一個(gè)唯一ID來標(biāo)志裝載器.在這個(gè)例子中,ID是0.

  • 可選的參數(shù),用于裝載器初始化時(shí)(本例中是null).

  • 一個(gè)LoaderManager.LoaderCallbacks的實(shí)現(xiàn).被LoaderManager調(diào)用以報(bào)告裝載器的事件,在這個(gè)例子中,類本實(shí)現(xiàn)了這個(gè)接口,所以傳的是它自己:this.initLoader()保證一個(gè)裝載器被初始化并激活.它具有兩種可能的結(jié)果:

  • 如果ID所指的裝載器已經(jīng)存在,那么這個(gè)裝載器將被重用.

  • 如果裝載器不存在,initLoader()就觸發(fā)LoaderManager.LoaderCallbacks的方法onCreateLoader().這是你實(shí)例化并返回一個(gè)新裝載器的地方.

在這兩種情況中,傳入的LoaderManager.LoaderCallbacks的實(shí)現(xiàn)都與裝載器綁定在一起.并且會(huì)在裝載器狀態(tài)變化時(shí)被調(diào)用.如果在調(diào)用這個(gè)方法時(shí),調(diào)用者正處于啟動(dòng)狀態(tài),并且所請(qǐng)求的裝載器已存在并產(chǎn)生了數(shù)據(jù),那么系統(tǒng)會(huì)馬上調(diào)用onLoadFinished()(也就是說在initLoader()還在執(zhí)行時(shí)).所以你必須為這種情況的發(fā)生做好準(zhǔn)備.

注意initLoader()返回所創(chuàng)建的裝載器,但是你不需保存一個(gè)對(duì)它的引用.LoaderManager自動(dòng)管理裝載器的生命.LoaderManager會(huì)在需要時(shí)開始和停止裝載動(dòng)作,并且維護(hù)裝載器的狀態(tài)和它所關(guān)聯(lián)的內(nèi)容.這意味著,你很少與裝載器直接交互.你通常都是使用LoaderManager.LoaderCallbacks的方法們?cè)谀硞€(gè)事件發(fā)生時(shí)介入到數(shù)據(jù)加載的過程中.

三、重啟裝載器

當(dāng)你使用initLoader()時(shí),如果指定ID的裝載器已經(jīng)存在,則它使用這個(gè)裝載器.如果不存在呢,它將創(chuàng)建一個(gè)新的.但是有時(shí)你卻是想丟棄舊的然后開始新的數(shù)據(jù).

要想丟棄舊數(shù)據(jù),你應(yīng)使用restartLoader().例如,下面這個(gè)SearchView.OnQueryTextListener的實(shí)現(xiàn)在用戶查詢發(fā)生改變時(shí)重啟了裝載器,裝載器于是需重啟從而能使用新的搜索過慮來進(jìn)行一次新的查詢.

public boolean onQueryTextChanged(String newText) {       // 當(dāng)動(dòng)作欄的搜索字串發(fā)生改時(shí)被調(diào)用.       // 更新搜索過慮,然后重新啟動(dòng)裝載利用這個(gè)新過慮進(jìn)行新的查詢.       mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;       getLoaderManager().restartLoader(0, null, this);       return true;   } LoaderManager.LoaderCallbacks是一個(gè)回調(diào)接口,它使得客戶端可以與LoaderManager進(jìn)行交互. 裝載器,一般指的是CursorLoader,我們希望在它停止后依然保持?jǐn)?shù)據(jù).這使得應(yīng)用可以在activity或fragment的 onStop() 和onStart() 之間保持?jǐn)?shù)據(jù),所以當(dāng)用戶回到一個(gè)應(yīng)用時(shí),它們不需等待數(shù)據(jù)加載.你使用LoaderManager.LoaderCallbacks 的方法們,在需要時(shí)創(chuàng)建新的裝載器,并且告訴應(yīng)用什么時(shí)候要停止使用裝載器的數(shù)據(jù). LoaderManager.LoaderCallbacks 包含以下方法們: onCreateLoader() —跟據(jù)傳入的ID,初始化并返回一個(gè)新的裝載器. onLoadFinished() —當(dāng)一個(gè)裝載器完成了它的裝載過程后被調(diào)用. onLoaderReset() —當(dāng)一個(gè)裝載器被重置而什其數(shù)據(jù)無效時(shí)被調(diào)用.  當(dāng)你試圖去操作一個(gè)裝載器時(shí)(比如,通過initLoader()),會(huì)檢查是否指定ID的裝載器已經(jīng)存在.如果它不存在,將會(huì)觸發(fā)LoaderManager.LoaderCallbacks 的方法onCreateLoader().這是你創(chuàng)建一個(gè)新裝載器的地方.通常這個(gè)裝載器是一個(gè)CursorLoader,但是你也可以實(shí)現(xiàn)你自己的裝載器.
String mCurFilter; ... public Loader<Cursor> onCreateLoader(int id, Bundle args) { // 這里是在需要?jiǎng)?chuàng)建新裝載器時(shí)被調(diào)用的. // 我們只是簡(jiǎn)單的擁有一個(gè)裝載器,所以我們不需要關(guān)心ID. // First, pick the base URI to use depending on whether we are // currently filtering. Uri baseUri; if (mCurFilter != null) { baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, Uri.encode(mCurFilter)); } else { baseUri = Contacts.CONTENT_URI; } // Now create and return a CursorLoader that will take care of // creating a Cursor for the data being displayed. String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" + Contacts.HAS_PHONE_NUMBER + "=1) AND (" + Contacts.DISPLAY_NAME + " != '' ))"; return new CursorLoader(getActivity(), baseUri, CONTACTS_SUMMARY_PROJECTION, select, null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); }

以上就是關(guān)于“Android中的Loader有什么用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

新聞名稱:Android中的Loader有什么用
標(biāo)題鏈接:http://muchs.cn/article40/jcjdeo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站網(wǎng)站改版、網(wǎng)站制作、品牌網(wǎng)站建設(shè)、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名