文章出处:http://blog.csdn.net/shift_wwx
前言:最近碰到了ContentObserver,网上搜了一下没有找到详细的解释,小结一下。这一篇先来说一下基本用法。
我们知道,在db 做insert、delete等操作的时候,db会改变,这个时候UI 可能是需要更新的,那怎么才能知道db 是有了变化呢?不能做个监听一直查询db是否变化吧?这样就太废精力了,android 中提供了ContentObserver来作为db 数据变化后的callback。
随便找个例子(取于TvProvider):
private Uri insertChannel(Uri uri, ContentValues values) { // Mark the owner package of this channel. values.put(Channels.COLUMN_PACKAGE_NAME, getCallingPackage_()); SQLiteDatabase db = mOpenHelper.getWritableDatabase(); long rowId = db.insert(CHANNELS_TABLE, null, values); if (rowId > 0) { Uri channelUri = TvContract.buildChannelUri(rowId); notifyChange(channelUri); return channelUri; } throw new SQLException("Failed to insert row into " + uri); }
values 是传进来的,一开始设置了一下package name,然后根据rowId找到 uri,最后调用notifyChange 这个 uri。
private void notifyChange(Uri uri) { final Set<Uri> batchNotifications = getBatchNotificationsSet(); if (batchNotifications != null) { batchNotifications.add(uri); } else { getContext().getContentResolver().notifyChange(uri, null); } }会通过ContentResolver 来调用 notifyChange,第二个参数是null,也就是说ContentObserver 是需要例外注册的。
在UI中可以注册:
private void init() { ContentObserver ob = new ChannelObserver(); mContext.getContentResolver().registerContentObserver(Channels.CONTENT_URI, true, ob); }需要注意的是第二个参数,如果是false 的话,注册的observer 是不会被调用的,这里必须要为 true。
第一个参数是需要观察的表名,第三个是ContentObserver。
当然在不用的时候取消掉观察:
mContext.getContentResolver().unregisterContentObserver(mChannelObserver);参数就是之前注册的的 observer了。
剩下就是ContentObserver 的实现了,为什么说实现?
public abstract class ContentObserver {他是一个抽象类,没办法实例,只好继承,实现其中重要的方法。
private final class ChannelObserver extends ContentObserver { public ChannelObserver() { super(new Handler()); } @Override public void onChange(boolean selfChange, Uri uri) { updateChannelList(); } @Override public IContentObserver releaseContentObserver() { // TODO Auto-generated method stub return super.releaseContentObserver(); } }首先是构造函数,需要传入Handler,可以通过handler 做些小事情,更新UI 什么的。当然不想用的话,弄个null 也是没问题的。
主要是需要实现onChange,db 更新后最终调用到这里,来更新UI 或者做一下更新的事情。
这一篇就先根据例子做一下简单的说明,这样功能就可以实现了,下一篇将结合 android 的 source code,分析更新的整个流程。