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; } } }