AbstractCursor.java文件
/**
*Thisisanabstractcursorclassthathandlesalotofthecommoncode
*thatallcursorsneedtodealwithandisprovidedforconveniencereasons.
*/
publicabstractclassAbstractCursorimplementsCrossProcessCursor{
privatestaticfinalStringTAG="Cursor";
DataSetObservablemDataSetObservable=newDataSetObservable();
ContentObservablemContentObservable=newContentObservable();
-------------------省略------------------
publicvoiddeactivate(){
deactivateInternal();
}
/**
*@hide
*/
publicvoiddeactivateInternal(){
if(mSelfObserver!=null){
mContentResolver.unregisterContentObserver(mSelfObserver);
mSelfObserverRegistered=false;
}
mDataSetObservable.notifyInvalidated();
}
publicbooleanrequery(){
if(mSelfObserver!=null&&mSelfObserverRegistered==false){
mContentResolver.registerContentObserver(mNotifyUri,true,mSelfObserver);
mSelfObserverRegistered=true;
}
mDataSetObservable.notifyChanged();
returntrue;
}
publicbooleanisClosed(){
returnmClosed;
}
publicvoidclose(){
mClosed=true;
mContentObservable.unregisterAll();
deactivateInternal();
}
-------------------省略------------------
publicvoidregisterContentObserver(ContentObserverobserver){
mContentObservable.registerObserver(observer);
}
publicvoidunregisterContentObserver(ContentObserverobserver){
//cursorwillunregisterallobserverswhenitclose
if(!mClosed){
mContentObservable.unregisterObserver(observer);
}
}
/**
*Thisishiddenuntilthedatasetchangemodelhasbeenre-evaluated.
*@hide
*/
protectedvoidnotifyDataSetChange(){
mDataSetObservable.notifyChanged();
}
/**
*Thisishiddenuntilthedatasetchangemodelhasbeenre-evaluated.
*@hide
*/
protectedDataSetObservablegetDataSetObservable(){
returnmDataSetObservable;
}
publicvoidregisterDataSetObserver(DataSetObserverobserver){
mDataSetObservable.registerObserver(observer);
}
publicvoidunregisterDataSetObserver(DataSetObserverobserver){
mDataSetObservable.unregisterObserver(observer);
}
/**
*Subclassesmustcallthismethodwhentheyfinishcommittingupdatestonotifyall
*observers.
*
*@paramselfChange
*/
protectedvoidonChange(booleanselfChange){
synchronized(mSelfObserverLock){
mContentObservable.dispatchChange(selfChange);
if(mNotifyUri!=null&&selfChange){
mContentResolver.notifyChange(mNotifyUri,mSelfObserver);
}
}
}
/**
*SpecifiesacontentURItowatchforchanges.
*
*@paramcrThecontentresolverfromthecaller'scontext.
*@paramnotifyUriTheURItowatchforchanges.Thiscanbea
*specificrowURI,orabaseURIforawholeclassofcontent.
*/
publicvoidsetNotificationUri(ContentResolvercr,UrinotifyUri){
synchronized(mSelfObserverLock){
mNotifyUri=notifyUri;
mContentResolver=cr;
if(mSelfObserver!=null){
mContentResolver.unregisterContentObserver(mSelfObserver);
}
mSelfObserver=newSelfContentObserver(this);
mContentResolver.registerContentObserver(mNotifyUri,true,mSelfObserver);
mSelfObserverRegistered=true;
}
}
-------------------省略------------------
@Override
protectedvoidfinalize(){
if(mSelfObserver!=null&&mSelfObserverRegistered==true){
mContentResolver.unregisterContentObserver(mSelfObserver);
}
}
/**
*CursorsusethisclasstotrackchangesothersmaketotheirURI.
*/
protectedstaticclassSelfContentObserverextendsContentObserver{
WeakReference<AbstractCursor>mCursor;
publicSelfContentObserver(AbstractCursorcursor){
super(null);
mCursor=newWeakReference<AbstractCursor>(cursor);
}
@Override
publicbooleandeliverSelfNotifications(){
returnfalse;
}
@Override
publicvoidonChange(booleanselfChange){
AbstractCursorcursor=mCursor.get();
if(cursor!=null){
cursor.onChange(false);
}
}
}
-------------------省略------------------
protectedContentResolvermContentResolver;
protectedbooleanmClosed=false;
privateUrimNotifyUri;
privateContentObservermSelfObserver;
finalprivateObjectmSelfObserverLock=newObject();
privatebooleanmSelfObserverRegistered;
}
/**
*Thisisanabstractcursorclassthathandlesalotofthecommoncode
*thatallcursorsneedtodealwithandisprovidedforconveniencereasons.
*/
publicabstractclassAbstractCursorimplementsCrossProcessCursor{
privatestaticfinalStringTAG="Cursor";
DataSetObservablemDataSetObservable=newDataSetObservable();
ContentObservablemContentObservable=newContentObservable();
-------------------省略------------------
publicvoiddeactivate(){
deactivateInternal();
}
/**
*@hide
*/
publicvoiddeactivateInternal(){
if(mSelfObserver!=null){
mContentResolver.unregisterContentObserver(mSelfObserver);
mSelfObserverRegistered=false;
}
mDataSetObservable.notifyInvalidated();
}
publicbooleanrequery(){
if(mSelfObserver!=null&&mSelfObserverRegistered==false){
mContentResolver.registerContentObserver(mNotifyUri,true,mSelfObserver);
mSelfObserverRegistered=true;
}
mDataSetObservable.notifyChanged();
returntrue;
}
publicbooleanisClosed(){
returnmClosed;
}
publicvoidclose(){
mClosed=true;
mContentObservable.unregisterAll();
deactivateInternal();
}
-------------------省略------------------
publicvoidregisterContentObserver(ContentObserverobserver){
mContentObservable.registerObserver(observer);
}
publicvoidunregisterContentObserver(ContentObserverobserver){
//cursorwillunregisterallobserverswhenitclose
if(!mClosed){
mContentObservable.unregisterObserver(observer);
}
}
/**
*Thisishiddenuntilthedatasetchangemodelhasbeenre-evaluated.
*@hide
*/
protectedvoidnotifyDataSetChange(){
mDataSetObservable.notifyChanged();
}
/**
*Thisishiddenuntilthedatasetchangemodelhasbeenre-evaluated.
*@hide
*/
protectedDataSetObservablegetDataSetObservable(){
returnmDataSetObservable;
}
publicvoidregisterDataSetObserver(DataSetObserverobserver){
mDataSetObservable.registerObserver(observer);
}
publicvoidunregisterDataSetObserver(DataSetObserverobserver){
mDataSetObservable.unregisterObserver(observer);
}
/**
*Subclassesmustcallthismethodwhentheyfinishcommittingupdatestonotifyall
*observers.
*
*@paramselfChange
*/
protectedvoidonChange(booleanselfChange){
synchronized(mSelfObserverLock){
mContentObservable.dispatchChange(selfChange);
if(mNotifyUri!=null&&selfChange){
mContentResolver.notifyChange(mNotifyUri,mSelfObserver);
}
}
}
/**
*SpecifiesacontentURItowatchforchanges.
*
*@paramcrThecontentresolverfromthecaller'scontext.
*@paramnotifyUriTheURItowatchforchanges.Thiscanbea
*specificrowURI,orabaseURIforawholeclassofcontent.
*/
publicvoidsetNotificationUri(ContentResolvercr,UrinotifyUri){
synchronized(mSelfObserverLock){
mNotifyUri=notifyUri;
mContentResolver=cr;
if(mSelfObserver!=null){
mContentResolver.unregisterContentObserver(mSelfObserver);
}
mSelfObserver=newSelfContentObserver(this);
mContentResolver.registerContentObserver(mNotifyUri,true,mSelfObserver);
mSelfObserverRegistered=true;
}
}
-------------------省略------------------
@Override
protectedvoidfinalize(){
if(mSelfObserver!=null&&mSelfObserverRegistered==true){
mContentResolver.unregisterContentObserver(mSelfObserver);
}
}
/**
*CursorsusethisclasstotrackchangesothersmaketotheirURI.
*/
protectedstaticclassSelfContentObserverextendsContentObserver{
WeakReference<AbstractCursor>mCursor;
publicSelfContentObserver(AbstractCursorcursor){
super(null);
mCursor=newWeakReference<AbstractCursor>(cursor);
}
@Override
publicbooleandeliverSelfNotifications(){
returnfalse;
}
@Override
publicvoidonChange(booleanselfChange){
AbstractCursorcursor=mCursor.get();
if(cursor!=null){
cursor.onChange(false);
}
}
}
-------------------省略------------------
protectedContentResolvermContentResolver;
protectedbooleanmClosed=false;
privateUrimNotifyUri;
privateContentObservermSelfObserver;
finalprivateObjectmSelfObserverLock=newObject();
privatebooleanmSelfObserverRegistered;
}
本文详细介绍了AbstractCursor类,它是Android中用于处理数据集更改通知的抽象类。AbstractCursor提供了注册和注销观察者的方法,并实现了数据集变化时的通知逻辑。此外,还介绍了如何设置通知URI以及内部SelfContentObserver的实现。
6665

被折叠的 条评论
为什么被折叠?



