在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