安卓學習之路之Loader的簡單用法
是從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);
}
}