1. 程式人生 > >安卓學習之路之Loader的簡單用法

安卓學習之路之Loader的簡單用法

1.laoder 英譯:裝載器
是從android3.0 以後出現的
東西,要理解這裡需要先理解為什麼會出現載入器(也有地方把它說成是裝載器)呢?

如果沒有載入器的話,

首先Activity是我們的前端頁面展現,資料庫是我們的資料持久化地址,那麼正常的邏輯就是在展示頁面的渲染頁面的階段進行資料庫查詢。拿到資料以後才展示頁面。

但是這個邏輯有一些缺點:

首先是查詢資料的邏輯放在了UI生成的同個執行緒中,這個就意味著在查詢資料的時候,UI頁面生成的工作被阻塞住了。UI一旦被阻塞使用者就會被感知出來了,因此就會出現各種無相應頁面(Application Not Response),或者activity頁面延遲的現象,這對使用者體驗來說是不可接受的。

其次是在渲染頁面的時候需要固定需要進行一次資料查詢,但是這個是很不節省資源的。假如一個Activity從一個停止狀態回到前臺,那麼這個時候儘管資料並沒有變化,但是也需要進行一次query操作。在浪費資源的同時也再次增加了頁面渲染失敗的風險。

還有就是當資料變化的時候如何通知頁面進行修改呢?這個時候往往就又要建立一個monitor的角色,來當資料來源變化的時候來讓頁面重新呼叫requery。

因此在Android的越來越提倡使用者體驗的今天,載入器和載入管理器(Loader,LoaderManager)就出現了。

loader的作用?

1.在單獨的執行緒中讀取資料

2.監視資料的更新

3. loader對Activity和Fragment都有效.

想要使用loader必須要有一個loadeManager的物件,一個loaderManager可以管理一個或者多個Loader物件,

一個Activity或者Fragent只有一個loaderMananger物件

loadeMangaer管理loader的初始化,重啟和銷燬操作

4.loader的使用:


>1:建立Loadermanager 物件
>2:LoaderManager物件  initLoader(1,2,3)  
  引數:3loaderManager.CallBacks<>


>3: onCreateLoader   下載資料  非同步的
>4:onLoadFinished  更新資料
>5;重啟或者關閉loader  onLoaderReset


4,CursorLoader:
>CursorLoader(Context context, Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)


5,AsyncTaskLoader<D>


/**

* 自定義的loader
*
*/
public static class MyAsyncTaskLoader extends AsyncTaskLoader<Cursor>{


public MyAsyncTaskLoader(Context context) {
super(context);
// TODO Auto-generated constructor stub
}


/**
* 當AsyncTaskLoader建立完畢  載入資料的方法  啟動載入
*/
@Override
protected void onStartLoading() {
// TODO Auto-generated method stub
super.onStartLoading();
forceLoad();//必須加   強制向下執行  強制載入非同步資料
Log.i("=onStartLoading==", Thread.currentThread().getId()+"   "+Thread.currentThread().getName());
}
/**
* 開啟後臺  workThread  做耗時操作
*/
@Override
public Cursor loadInBackground() {
// TODO Auto-generated method stub
Log.i("=loadInBackground==", Thread.currentThread().getId()+"   "+Thread.currentThread().getName());
Cursor cursor = db.rawQuery("select * from person", null);
return cursor;
}
/**
* 執行loadInBackground完成之後  呼叫該方法  接受 loadInBackground的值
*/
@Override
public void deliverResult(Cursor data) {
// TODO Auto-generated method stub
Log.i("=deliverResult==", Thread.currentThread().getId()+"   "+Thread.currentThread().getName());
super.deliverResult(data);

}

}