package com.example.andday17customobervserloader; import android.app.Activity; import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.ListView; public class MainActivity extends Activity { private ListView listview; private SimpleCursorAdapter adapter; private String uri_sms = "content://sms"; private boolean isObserver;// 用來觀察判斷是否有改變數據,決定是否調用數據的更新(標記) // 不用lader加載器,用AsyncTask來實現本身的觀察者類(加載器) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listview = (ListView) this.findViewById(R.id.listView_main_titlelist); adapter = new SimpleCursorAdapter(this, R.layout.item_listview, null, new String[] { "address", "body" }, new int[] { R.id.text_item_address, R.id.text_item_body }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); listview.setAdapter(adapter); new MyAsyncTask().execute(); } class MyAsyncTask extends AsyncTask<Void, Void, Cursor> { @Override protected Cursor doInBackground(Void... params) { ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(Uri.parse(uri_sms), new String[] { "_id", "address", "body" }, null, null, "date desc"); return cursor; // Cursor cursor = resolver.query(Uri.parse(uri_sms), null, null, // null, "date desc"); // return cursor; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(Cursor result) { super.onPostExecute(result); // 註冊一個觀察者 result.registerContentObserver(new MyObservser(null)); // 交換更新數據 adapter.swapCursor(result); // 將觀察判斷的標誌改成false; isObserver = false; } } // 觀察者要繼承ContentObserver類來實現是本身的自定義觀察類 class MyObservser extends ContentObserver { public MyObservser(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { // TODO Auto-generated method stub super.onChange(selfChange); if (isObserver) { return;// 若是爲true表明沒數據更新 } // 有數據更新就交換更新數據,從新啓動異步類 new MyAsyncTask().execute(); isObserver = true; } } }