用AsyncTask来实现自己定义的观察者类(加载器)Loader(17)

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

	}
}


你可能感兴趣的:(用AsyncTask来实现自己定义的观察者类(加载器)Loader(17))