关闭

Android中ContentObserver的使用

1314人阅读 评论(0) 收藏 举报
分类:

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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:410987次
    • 积分:7097
    • 等级:
    • 排名:第3539名
    • 原创:264篇
    • 转载:31篇
    • 译文:22篇
    • 评论:58条
    成长轨迹
    目前研究方向:Android,React Native,机器学习

      微信公众号:DroidMind
      (欢迎关注)