編輯: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;
}
這篇文章寫的非常好,深入淺出,關鍵還是一位大三學生自己剖析的心得。這是我喜歡此文的原因。下面請看正文: 作為一個大三的預備程序員,我學習android的一大樂趣是
記得在2013年12月的時候,有系列文章是介紹怎麼開發一個智能手表的App,讓用戶可以在足球比賽中記錄停表時間。隨著Android Wear的問世,在可穿戴設備中
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放