android CursorAdapter的监听事件
来源:互联网 发布:怎么改善太阳凹陷知乎 编辑:程序博客网 时间:2024/06/03 13:13
//contentObserver只是通知数据库中内容变化了
cursor.registerContentObserver(mChangeObserver);
//datasetObserver是调用requery之后通知上层cursor数据内容已经更新
cursor.registerDataSetObserver(mDataSetObserver);
我们的调用流程如下:
当我们使用getContentResolver().query()的时候,我们的resolver会通过uri找到对应的provider,调用相应的query()方法,
该方法中的部分内容:
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor ret = qb.query(db, projection, selection,selectionArgs, null, null, finalSortOrder);
// TODO: Does this need to be a URI for this provider.
ret.setNotificationUri(getContext().getContentResolver(), uri);
return ret;
Cursor本身只是接口,实际调用的应该是AbstractCursor
public void setNotificationUri(ContentResolver cr, Uri notifyUri) {
synchronized (mSelfObserverLock) {
mNotifyUri = notifyUri;
mContentResolver = cr;
if (mSelfObserver != null) {
mContentResolver.unregisterContentObserver(mSelfObserver);
}
mSelfObserver = new SelfContentObserver(this);
mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);
mSelfObserverRegistered = true;
}
}
//AbstractCursor的内部类
protected static class SelfContentObserver extends ContentObserver {
WeakReference<AbstractCursor> mCursor;
public SelfContentObserver(AbstractCursor cursor) {
super(null);
mCursor = new WeakReference<AbstractCursor>(cursor);
}
@Override
public boolean deliverSelfNotifications() {
return false;
}
@Override
public void onChange(boolean selfChange) {
AbstractCursor cursor = mCursor.get();
if (cursor != null) {
cursor.onChange(false);
}
}
}
ContentObservable mContentObservable = new ContentObservable(); //AbstractCursor持有的contentObservable
//AbstractCursor的onchange()
protected void onChange(boolean selfChange) {
synchronized (mSelfObserverLock) {
mContentObservable.dispatchChange(selfChange);
if (mNotifyUri != null && selfChange) {
mContentResolver.notifyChange(mNotifyUri, mSelfObserver); //selfChange = false
}
}
}
AbstractCursor中
public void registerContentObserver(ContentObserver observer) {
mContentObservable.registerObserver(observer);
}
在ContentObservable中
public void dispatchChange(boolean selfChange) {
synchronized(mObservers) {
for (ContentObserver observer : mObservers) {
if (!selfChange || observer.deliverSelfNotifications()) {
observer.dispatchChange(selfChange);
}
}
}
}
在CursorAdapter中我们注册了ContentObserver
private class ChangeObserver extends ContentObserver {
public ChangeObserver() {
super(new Handler());
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
@Override
public void onChange(boolean selfChange) {
onContentChanged();
}
}
//父类的方法
public final void dispatchChange(boolean selfChange) {
if (mHandler == null) {
onChange(selfChange);
} else {
mHandler.post(new NotificationRunnable(selfChange));
}
}
//父类的内部类
private final class NotificationRunnable implements Runnable {
private boolean mSelf;
public NotificationRunnable(boolean self) {
mSelf = self;
}
public void run() {
ContentObserver.this.onChange(mSelf);
}
}
在CursorAdapter中
protected void onContentChanged() {
if (mAutoRequery && mCursor != null && !mCursor.isClosed()) {
if (Config.LOGV) Log.v("Cursor", "Auto requerying " + mCursor + " due to update");
mDataValid = mCursor.requery();
}
}
在AbstractCursor中
public boolean requery() {
if (mSelfObserver != null && mSelfObserverRegistered == false) {
mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver);
mSelfObserverRegistered = true;
}
mDataSetObservable.notifyChanged(); //任何继承AbstractCursor的Cursor都将通过调用super.requery()执行此句
return true;
}
如果我们注册了dataset的observer,就会得到相应的通知。
总结:
contentObserver是一个提前通知,这时候只是通知cursor说,我的内容变化了。
datasetObserver是一个后置通知,只有通过requery() deactivate() close()方法的调用才能获得这个通知。
因此,最为重要的还是ContentObserver,它可以告诉你数据库变化了,当然如果你要在更新完Cursor的dataset之后做一些
事情,datasetObserver也是必需的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yangxinle137/archive/2010/11/03/5985515.aspx
- android CursorAdapter的监听事件
- android CursorAdapter的监听事件
- Android cursor和cursorAdapter 的监听机制
- Android CursorAdapter的使用
- Android CursorAdapter简单的实现
- Android 中 CursorAdapter 的用法
- android 监听事件的处理
- 常用的监听事件(android)
- Android CursorAdapter
- Android的CursorAdapter与CursorFilter机制
- Android的CursorAdapter与CursorFilter机制
- Android的CursorAdapter与CursorFilter机制
- Android中CursorAdapter的使用详解
- Android中CursorAdapter的使用详解
- Android的TextView的双击事件监听
- Android的监听事件的总结
- Android之事件监听的使用(OnClickListener)
- Android各种控件的事件监听
- ODU恢复测试一:truncate表恢复
- 点击Item时无背景颜色变化
- string.Empty、null、""、DBnull 四者的区别
- maven project pom.xml
- mre应用和Native的交互之消息传递
- android CursorAdapter的监听事件
- 网上火车票几点放票
- 关于验证码图片成生相关
- 结构体内存分配
- 解析BLOT例子——HelloBolt5
- 显示Documents目录下的所有文件
- OC中的集合类-NSSet、NSArray、NSDictionary
- 日发明家研制新仪器 可把狗叫声翻译成人话
- hadoop源码研读之路(六)----RPC的Client端和Server端