Android中ContentObserver的使用
来源:互联网 发布:pop3服务器端口 编辑:程序博客网 时间:2024/05/31 00:39
如果我们希望监测一个数据源的变化情况,如果单独使用一个线程去不断的进行查询,那么效率就太低了,我们可以使用ContentObserver,顾名思义,它是一个内容观察者,但指定数据源数据发生变化的时候,它会主动进行通知,这样就可以对一个数据源实时的进行监测了。
1、自定义ContentObserver
public class MyContentObsever extends ContentObserver { private static final String TAG = "MyContentObsever"; public MyContentObsever(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { // 客户端可以得到数据源发生改变的通知 Log.d(TAG, "数据源发生了变化!"); super.onChange(selfChange); } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); }}
2、写一个客户端,注册监听,监听指定的URI
public class MainActivity extends Activity { private MyContentObsever myContentObsever; private Handler mHander = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myContentObsever = new MyContentObsever(mHander); getContentResolver().registerContentObserver(MyService.URI, false, myContentObsever); startService(new Intent(this, MyService.class)); }}
3、在服务端中进行数据修改,并且通知客户端
public class MyService extends Service { public static final String AUTHORITY = "mirhunana"; public static final Uri URI = Uri.parse("content://" + AUTHORITY + "/cache"); public MyService() { } @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. throw new UnsupportedOperationException("Not yet implemented"); } @Override public void onCreate() { super.onCreate(); // 假设我们的数据源在这个服务中发生了改变,我们来通知客户端 ContentResolver resolver = getContentResolver(); resolver.notifyChange(URI, null); }}
最终,客户端就会回调MyContentObsever中的onChange方法,这样我们在客户端就可以知道数据源发生了变化。
上面就是基本用法,就是对指定URI的数据源进行监听,当数据源发生改变之后,就主动进行通知,这样我们的监听者就可以得到数据源发生变化的通知。
(1)ontentObserver类.
构造方法
public void ContentObserver(Handler handler)
说明:所有 ContentObserver的派生类都需要调用该构造方法
参数: handler Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。
常用方法
void onChange(boolean selfChange)
功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。
参数:selfChange 回调后,其值一般为false,
观察特定Uri的步骤如下:
1、创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法去处理回调后的功能实现
2、利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者
3、由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用
unregisterContentObserver()去取消注册。
(2)获取ContentResolver
Context.getContentResolver();
(3)抽象类ContentResolver类中的方法
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
参数:
uri
需要观察的Uri(需要在UriMatcher里注册,否则该Uri也没有意义了)notifyForDescendents
为false 表示精确匹配,即只匹配该Uri为true 表示可以同时匹配其派生的Uri,举例如下:假设UriMatcher 里注册的Uri共有一下类型:1 、content://com.qin.cb/student (学生)2 、content://com.qin.cb/student/# 3、 content://com.qin.cb/student/schoolchild(小学生,派生的Uri) 假设我们当前需要观察的Uri为content://com.qin.cb/student,如果发生数据变化的 Uri 为 content://com.qin.cb/student/schoolchild ,当notifyForDescendents为 false,那么该ContentObserver会监听不到, 但是当notifyForDescendents 为ture,能捕捉该Uri的数据库变化。
- observer
ContentObserver的派生类实例
public final void unregisterContentObserver(ContentObserver observer)
功能:取消对给定Uri的观察
参数: observer ContentObserver的派生类实例
参考文章:Android中内容观察者的使用—- ContentObserver类详解
- Android中ContentObserver的使用
- Android中内容观察者的使用---- ContentObserver
- android 中ContentObserver和DataSetObserver的使用
- Android中内容观察者的使用---- ContentObserver
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- Android中内容观察者的使用---- ContentObserver类详解
- J2EE笔试面试题
- spatialhadoop2.1源码阅读(一) shadoop脚本文件
- 欢迎使用CSDN-markdown编辑器
- Yarn集群资源规划
- 创建android项目时没有自动生成R.java文件的解决方法
- Android中ContentObserver的使用
- sicily 1083. Networking
- jQuery实现侧边导航点击隐藏动画设计
- ios学习笔记(六)视图控制器
- 对红黑树的一些理解
- web入门第三天
- 关于微博
- 判断网络状态
- asp.net七层架构是指什么