Android中ContentObserver的使用

原创 2015年11月18日 19:20:12

如果我们希望监测一个数据源的变化情况,如果单独使用一个线程去不断的进行查询,那么效率就太低了,我们可以使用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类详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

毕业半年,点滴在心中

转载请注明出处:http://blog.csdn.net/qinjuning                   先借用“幸福来点名的模式”...

Android中内容观察者的使用---- ContentObserver类详解

转载请注明出处:http://blog.csdn.net/qinjuning                     &#...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

ContentObserver 内容观察者作用及特点

ContentObserver 内容观察者作用及特点

android 使用contentobserver监听数据库内容变化

android 使用contentobserver监听数据库内容变化 在android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占...

Android ContentObserver使用

sample1:// 创建ContentObserver内容观察者类.用于观察数据的变化和及时更新 private class MediaObserver extends ContentObserv...

android 中的 ContentObserver (一)

文章出处:http://blog.csdn.net/shift_wwx 请转载的朋友标明出处~~ 我们知道,在db 做insert、delete等操作的时候,db会改变,这个时候UI 可能是需要...

android 中的 ContentObserver (二)

前一篇博文(android 中的 ContentObserver (一) )中利用最近做的项目,简单的说明了一下 ContentObserver 操作过程,这一篇详细的说一下过程。

Android学习之service的使用

Android service     1、创建一个service   然后再manifest中会自动生成service的表签 service     android:name=".MyService...

安卓中通过intent组件跳转到系统联系人编辑界面,及具体案例分析

本人对于intent的用法的一些总结,在此抛砖引玉,还望大家多提建议,共勉!!!
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)