址:http://blog.csdn.net/qinjuning
媒介: 工作中,须要开启一个线程多量的查询某个数据库值发送了变更,导致的开销很大,后来在垂老的指导下,哄骗了
ContentObserver完美的解决了该题目,感觉很高兴,做完之后本身也对ContentObserver做下总结。
ContentObserver——内容调查者,目标是调查(捕获)特定Uri引起的数据库的变更,继而做一些响应的处理惩罚,它类似于
数据库技巧中的触发器(Trigger),当ContentObserver所调查的Uri产生变更时,便会触发它。触发器分为表触发器、行触发器,
响应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
熟悉Content Provider(内容供给者)的应当知道,我们可以经由过程UriMatcher类注册不合类型的Uri,我们可以经由过程这些不合的
Uri来查询不合的成果。按照Uri返回的成果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。
注册/作废注册ContentObserver办法,抽象类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的派生类实例
ContentObserver类介绍
机关办法 public void ContentObserver(Handler
handler)
申明:所有 ContentObserver的派生类都须要调用该机关办法
参数: handler Handler对象。可所以主线程Handler(这时辰可以更新UI 了),也可所以任何Handler对象。
常用办法
void onChange(boolean selfChange)
功能:当调查到的Uri产生变更时,回调该办法去向理惩罚。所有ContentObserver的派生类都须要重载该办法去向理惩罚逻辑。
参数:selfChange 回调后,其值一般为false,该参数意义不大(我也不懂,懂得办法最首要)。
别的两个办法,用处不大,我也不懂,大师参照SDK自行懂得,冒昧了。
boolean deliverSelfNotifications()
申明:Returns true if this observer is
interested in notifications for changes made through the cursor the
observer is registered with.
final void dispatchChange(boolean selfChange)
调查特定Uri的步调如下:
1、 创建我们特定的ContentObserver派生类,必须重载父类机关办法,必须重载onChange()办法去向理惩罚回调后的功能实现
2、 哄骗context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()办法去注册内容调查者
3、 因为ContentObserver的生命周期不合步于Activity和Service等,