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

	}
}
相關文章
相關標籤/搜索