Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android使用Loader示例

Android使用Loader示例

編輯:Android開發實例

  Android 3.0 sdk,引入了很多新api,比如Loader。和Fragment類似(編寫兼容android1.6的fragment),該api也可在Android 1.6以上版本執行。

  以下介紹如何編寫Loader,實現對ListView的異步加載。效果如圖:

  示例中有一個後台線程每隔3秒更新數據庫的長江記錄,將記錄改為“長江”或“Long River”。ListView無需監控數據庫變化,基於Loader,會自動更新。實際上這裡面是觀察者模式,無非是系統自帶了,只需調用即可,無需自己構造觀察者。

  這個示例也是完整的sqlite+content provider+cursor adapter+listview+loader組合示例。

  另外,2.3以前的Activity類沒有提供一些Loader的幫助方法,需要讓自己的Activity實現類繼承FragmentActivity:

  java代碼:
  public class ListViewActivity extends FragmentActivity

  本示例是在在視圖顯示中使用Theme基礎上實現的。
  Activity類和RiverContentProvider類做了修改。
  Activity類:

  public class ListViewActivity extends FragmentActivity {

  private ListView riverListView;

  private SimpleCursorAdapter adapter;
  /** Called when the activity is first created. */

  @Override
  public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  initLoader();
  setRiverListViewAdapter();
  }

  private void initLoader() {
  getSupportLoaderManager().initLoader(0, null,
  new LoaderCallbacks<Cursor>() {

  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
  Log.d("list", "on create loader");
  CursorLoader cursorLoader=new CursorLoader(ListViewActivity.this,
  RiverContentProvider.CONTENT_URI, new String[] {
  RiverContentProvider._ID,
  RiverContentProvider.NAME,
  RiverContentProvider.INTRODUCTION },
  null, null, null);
  //cursorLoader.setUpdateThrottle(1000);
  return cursorLoader;
  }

  @Override
  public void onLoadFinished(Loader<Cursor> loader,
  Cursor cursor) {
  Log.d("list", "on loader finished");
  adapter.swapCursor(cursor);
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
  Log.d("list", "on loader reset");
  adapter.swapCursor(null);
  }
  });
  }

  private void setRiverListViewAdapter() {
  riverListView = (ListView) this.findViewById(R.id.riverList);

  Cursor cursor = managedQuery(RiverContentProvider.CONTENT_URI, null,
  null, null, null);
  adapter = new SimpleCursorAdapter(this, R.layout.row, cursor,
  new String[] { RiverContentProvider.NAME,
  RiverContentProvider.INTRODUCTION }, new int[] {
  R.id.riverName, R.id.riverIntroduction }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
  riverListView.setAdapter(adapter);
  }

  主要是增加了initLoader方法。這裡主要是實現了LoaderCallbacks接口。其中:

  onCreateLoader,在創建activity時跟著onCreate會調用一次 
  onLoadFinished,每次改變和Loader相關的數據庫記錄後會調用一次 
  onLoaderReset,在關閉Activity時調用,釋放資源
  然後,在Content provider中,要調用類似觀察者模式中通知的方法,即,在update方法中通知觀察者記錄改變,在query方法中注冊觀察者,這樣通知來了可接收並處理。

  java代碼:
  @Override
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
  int returnValue = database.update("rivers", values, selection, selectionArgs);
  getContext().getContentResolver().notifyChange(uri, null);
  return returnValue;
  }

  query方法:

  java代碼:
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder){
  Cursor cursor = database.query("rivers", projection, selection, selectionArgs, null, null, sortOrder);
  cursor.setNotificationUri(getContext().getContentResolver(), uri);
  return cursor;
  }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved