loadermanager的使用

Android 3.0中提供了一個新概念Loaders,通過LoaderManager類可以很輕松的異步加載數據從Fragment或Activity 中,Loaders提供了回調機制通知最終的運行結果,有點類似AsyncTask類,但由于Loader對于并發可以用過Loader管理器統一管理,所以更適合批量處理多個異步任務的處理(當然內部仍然是多線程)。下面就一起和大家看下honeycomb中的新特性吧,對于解決多重異步I/O加快Android平板應用的運行是十分有效的。 一、LoaderManager LoaderManager類位于android.app.LoaderManager,提供了以下幾個方法java代碼:
abstract void destroyLoader(int id) //停止并移除loader通過ID
abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) //打印LoaderManager的狀態到一個流中
static void enableDebugLogging(boolean enabled) //啟用debug記錄
abstract <D> Loader<D> getLoader(int id) //返回找到的ID或沒有匹配的在Loader中
abstract <D> Loader<D> initLoader(int id, Bundle args, LoaderCallbacks<D> callback) //初始化Loader使其成為活動狀態
abstract <D> Loader<D> restartLoader(int id, Bundle args, LoaderCallbacks<D> callback) //啟動一個新的或重啟一個存在的Loader在管理器中

復制代碼
同時LoaderManager還有一個回調接口android.app.LoaderManager.LoaderCallbacks 用于和LoaderManager交互java代碼:void abandon() //高速Loader他在綁定
String dataToString(D data) //用于調試,轉換一個Loader數據類的實例為字符串用于打印
void deliverResult(D data) //發送一個load注冊的listener結果
void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) //打印loader狀態通過給定的流
void forceLoad() //強制一個異步載入
Context getContext() //返回Context實例
int getId()
boolean isAbandoned() //判斷是否已經綁定
boolean isReset() //判斷是否已經重啟
boolean isStarted() //判斷是否已經執行
void onContentChanged() //內容變化回調

registerListener(int id, OnLoadCompleteListener<D> listener)
void reset() //重置一個Loader的狀態
final void startLoading() //啟動一個異步的載入從Loader的數據
void stopLoading() //停止載入
boolean takeContentChanged() String toString()
void unregisterListener(OnLoadCompleteListener<D> listener)

復制代碼
提供的子類 android.content.Loader.ForceLoadContentObserver 和 接口 android.content.Loader.OnLoadCompleteListener為了更清晰的表達Android開發網給出一個SDK例子完整代碼,來作分析java代碼:public class LoaderThrottle extends Activity {
static final String TAG = "LoaderThrottle";

public static final String AUTHORITY = "com.example.android.apis.app.LoaderThrottle";

public static final class MainTable implements BaseColumns {

// This class cannot be instantiated
private MainTable() {}

public static final String TABLE_NAME = "main";

public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/main");

public static final Uri CONTENT_ID_URI_BASE
= Uri.parse("content://" + AUTHORITY + "/main/");

public static final String CONTENT_TYPE
= "vnd.android.cursor.dir/vnd.example.api-demos-throttle";

public static final String CONTENT_ITEM_TYPE
= "vnd.android.cursor.item/vnd.example.api-demos-throttle";
public static final String DEFAULT_SORT_ORDER = "data COLLATE LOCALIZED ASC";

public static final String COLUMN_NAME_DATA = "data";
}

static class DatabaseHelper extends SQLiteOpenHelper {

private static final String DATABASE_NAME = "loader_throttle.db";
private static final int DATABASE_VERSION = 2;

DatabaseHelper(Context context) {

// calls the super constructor, requesting the default cursor factory.
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + MainTable.TABLE_NAME + " ("

  • MainTable._ID + " INTEGER PRIMARY KEY,"
  • MainTable.COLUMN_NAME_DATA + " TEXT"
  • ");");
    }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

// Logs that the database is being upgraded
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "

  • newVersion + ", which will destroy all old data");

// Kills the table and existing data
db.execSQL("DROP TABLE IF EXISTS notes");

// Recreates the database with a new version
onCreate(db);
}
}

復制代碼
系列之淺談Android 3.0中的LoaderManager(二)的帖子鏈接http://www.eoeandroid.com/thread-101847-1-1.html系列之淺談Android 3.0中的LoaderManager(三)的帖子鏈接http://www.eoeandroid.com/thread-101848-1-1.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,869評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,084評論 25 708
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,510評論 0 17
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,754評論 18 399
  • 曾經在思科的工廠測試系統`KlemTest` (`SUSE`命令行模式)中使用`VI`/`VIM`超過2年半,現在...
    戈多在地獄閱讀 1,830評論 1 13