文档章节

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

f
 flyqilong
发布于 2016/02/21 21:50
字数 361
阅读 7
收藏 1
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;
		}

	}
}


© 著作权归作者所有

f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Th...

developerHaoz
2017/11/27
0
0
Android 装载器---概要

在Android3.0中引入了装载器的功能,这使它很容易在Activity或Fragment中使用异步的方式加载数据。装载器的特点如下: 1. 装载器对于每个Activity和Fagment都是有效的; 2. 装载器提供异步数...

长平狐
2012/10/16
41
0
棒棒糖之——Android中全套异步处理的详细讲解

一、前言 在应用的开发中我们正确处理好主线程和子线程之间的关系,耗时的操作都放到子线程中处理,避免阻塞主线程,导致ANR。异步处理技术是提高应用性能,解决主线程和子线程之间通信问题的...

落地吃鸡
2017/05/03
0
0
Android知识点回顾之Loader

Loader是谷歌在Android 3.0引入的异步加载机制,能够对数据异步加载并显示到Activity或Fragment上,使用者不需要对数据的生命周期进行管理,而是交给Loader机制来管理。 使用Loader的优点 假...

星泉毅
2017/12/06
0
0
Java类加载器之线程上下文类加载器(ContextClassLoader)

Thread.setContextClassLoader(ClassLoader cl) 在Java中提供了对于线程设置ContextClassLoader的方法,关于上下文类加载器,下面摘抄的内容将的比较明白: 线程上下文类加载器(context cla...

newever
2016/08/28
875
1

没有更多内容

加载失败,请刷新页面

加载更多

gradle grovvy中的闭包

1. 无参数的闭包 //这b1就是一个闭包def b1={ println "hello b1"}//定义方法,包含闭包类型的参数def method1(Closure closure){closure()}//执行method1method1(b1) 执行结果 ...

edison_kwok
42分钟前
3
0
基于Spring Boot + Dubbo的全链路日志追踪(一)

一、 概要 当前公司后端整体架构为:Spring Boot + Dubbo。由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志。这也对后面的问题排查带来了很大的困难,...

明天以后
今天
7
0
安装fastdfs文件服务器步骤

1、安装libfastcommon wget https://github.com/happyfish100/libfastcommon/archive/master.zip 解压后安装 cd fastcommon-master ./make.sh ./make.sh install 2、安装 FastDFS,从sourcef......

lsjlgo
今天
3
0
MySQL 5.7 免安装版配置

下载地址:https://dev.mysql.com/downloads/mysql/ 安装步骤 1.下载zip解压到目录下 2.配置环境变量 新建系统变量:MYSQL_HOME,值:D:\DevelopmentTool\Mysql-5.7.26-winx64 修改path变量:...

华山猛男
今天
7
0
java map的遍历

//从大的角度可以分为两类Set<String> set=map.keySet();这里面还可以分为3类, 从set的角度来分 //Set<Map.Entry<String, String>> entery=map.entrySet(); public class Test { public sta......

南桥北木
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部