01-16-12 观察者模式 - LiveData与ContentObserver的观察者实现观察者模式是什么定义对象间的一对多依赖关系当一个对象状态改变时所有依赖它的对象都会收到通知。核心要点Subject被观察者维护观察者列表负责通知Observer观察者接收通知做出响应解耦Subject和Observer通过接口交互Android源码中的观察者实现案例1LiveData - 生命周期感知观察者源码位置androidx/lifecycle/LiveData.javapublicabstractclassLiveDataT{privateSafeIterableMapObserver?superT,ObserverWrappermObserversnewSafeIterableMap();privateintmActiveCount0;privatevolatileObjectmData;privateintmVersion;// 注册观察者生命周期感知publicvoidobserve(NonNullLifecycleOwnerowner,NonNullObserver?superTobserver){if(owner.getLifecycle().getCurrentState()DESTROYED){return;}LifecycleBoundObserverwrappernewLifecycleBoundObserver(owner,observer);ObserverWrapperexistingmObservers.putIfAbsent(observer,wrapper);if(existing!null!existing.isAttachedTo(owner)){thrownewIllegalArgumentException(Cannot add the same observer with different lifecycles);}if(existing!null){return;}owner.getLifecycle().addObserver(wrapper);}// 注册观察者永久观察publicvoidobserveForever(NonNullObserver?superTobserver){AlwaysActiveObserverwrappernewAlwaysActiveObserver(observer);ObserverWrapperexistingmObservers.putIfAbsent(observer,wrapper);if(existinginstanceofLifecycleBoundObserver){thrownewIllegalArgumentException(Cannot add the same observer with different lifecycles);}if(existing!null){return;}wrapper.activeStateChanged(true);}// 移除观察者publicvoidremoveObserver(NonNullfinalObserver?superTobserver){ObserverWrapperremovedmObservers.remove(observer);if(removednull){return;}removed.detachObserver();removed.activeStateChanged(false);}// 设置值主线程protectedvoidsetValue(Tvalue){mVersion;mDatavalue;dispatchingValue(null);}// 设置值后台线程protectedvoidpostValue(Tvalue){booleanpostTask;synchronized(mDataLock){postTaskmPendingDataNOT_SET;mPendingDatavalue;}if(!postTask){return;}ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);}// 通知观察者voiddispatchingValue(NullableObserverWrapperinitiator){if(mDispatchingValue){mDispatchInvalidatedtrue;return;}mDispatchingValuetrue;do{mDispatchInvalidatedfalse;if(initiator!null){considerNotify(initiator);initiatornull;}else{for(IteratorMap.EntryObserver?superT,ObserverWrapperiteratormObservers.iteratorWithAdditions();iterator.hasNext();){considerNotify(iterator.next().getValue());if(mDispatchInvalidated){break;}}}}while(mDispatchInvalidated);mDispatchingValuefalse;}privatevoidconsiderNotify(ObserverWrapperobserver){if(!observer.mActive){return;}if(!observer.shouldBeActive()){observer.activeStateChanged(false);return;}if(observer.mLastVersionmVersion){return;}observer.mLastVersionmVersion;observer.mObserver.onChanged((T)mData);}// 生命周期感知包装器classLifecycleBoundObserverextendsObserverWrapperimplementsLifecycleEventObserver{NonNullfinalLifecycleOwnermOwner;LifecycleBoundObserver(NonNullLifecycleOwnerowner,Observer?superTobserver){super(observer);mOwnerowner;}OverridebooleanshouldBeActive(){returnmOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);}OverridepublicvoidonStateChanged(NonNullLifecycleOwnersource,NonNullLifecycle.Eventevent){Lifecycle.StatecurrentStatemOwner.getLifecycle().getCurrentState();if(currentStateDESTROYED){removeObserver(mObserver);return;}Lifecycle.StateprevStatenull;while(prevState!currentState){prevStatecurrentState;activeStateChanged(shouldBeActive());currentStatemOwner.getLifecycle().getCurrentState();}}OverridebooleanisAttachedTo(LifecycleOwnerowner){returnmOwnerowner;}OverridevoiddetachObserver(){mOwner.getLifecycle().removeObserver(this);}}}为什么这么设计生命周期感知自动在Activity/Fragment销毁时移除观察者避免内存泄漏粘性事件新观察者注册时立即收到最新值线程安全postValue支持后台线程更新数据使用示例// ViewModel中定义LiveDataclassUserViewModel:ViewModel(){privateval_userMutableLiveDataUser()valuser:LiveDataUser_userfunloadUser(){viewModelScope.launch{valuseruserRepository.getUser()_user.valueuser// 主线程// _user.postValue(user) // 后台线程}}}// Activity中观察classMainActivity:AppCompatActivity(){privatevalviewModel:UserViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)// 观察LiveData生命周期感知viewModel.user.observe(this){user-// UI更新nameTextView.textuser.name ageTextView.textuser.age.toString()}viewModel.loadUser()}}案例2ContentObserver - 数据库观察者publicabstractclassContentObserver{privatefinalObjectmLocknewObject();privateTransportmTransport;// IContentObserver的Binder实现HandlermHandler;publicContentObserver(Handlerhandler){mHandlerhandler;}// 注册观察publicfinalvoiddispatchChange(booleanselfChange){dispatchChange(selfChange,null);}publicfinalvoiddispatchChange(booleanselfChange,Uriuri){if(mHandlernull){onChange(selfChange,uri);}else{mHandler.post(newNotificationRunnable(selfChange,uri));}}// 子类实现publicvoidonChange(booleanselfChange){// 默认实现}publicvoidonChange(booleanselfChange,Uriuri){onChange(selfChange);}privatefinalclassNotificationRunnableimplementsRunnable{privatefinalbooleanmSelfChange;privatefinalUrimUri;publicNotificationRunnable(booleanselfChange,Uriuri){mSelfChangeselfChange;mUriuri;}Overridepublicvoidrun(){ContentObserver.this.onChange(mSelfChange,mUri);}}}// ContentResolver注册/取消注册publicabstractclassContentResolver{publicfinalvoidregisterContentObserver(Uriuri,booleannotifyForDescendants,ContentObserverobserver){registerContentObserver(uri,notifyForDescendants,observer,UserHandle.myUserId());}publicfinalvoidunregisterContentObserver(ContentObserverobserver){// 移除观察者}// 通知观察者publicvoidnotifyChange(Uriuri,ContentObserverobserver){notifyChange(uri,observer,true);}}使用示例// 观察联系人变化classContactObserver(handler:Handler):ContentObserver(handler){overridefunonChange(selfChange:Boolean,uri:Uri?){Log.d(ContactObserver,Contact changed:$uri)// 重新查询联系人loadContacts()}}// 注册观察者valobserverContactObserver(Handler(Looper.getMainLooper()))contentResolver.registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,// notifyForDescendantsobserver)// 取消注册contentResolver.unregisterContentObserver(observer)案例3BroadcastReceiver - 系统事件观察// 观察网络状态classNetworkReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){valconnectivityManagercontext.getSystemService(Context.CONNECTIVITY_SERVICE)asConnectivityManagervalnetworkInfoconnectivityManager.activeNetworkInfovalisConnectednetworkInfo!nullnetworkInfo.isConnected Log.d(NetworkReceiver,Network connected:$isConnected)}}// 注册接收器valreceiverNetworkReceiver()valfilterIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)registerReceiver(receiver,filter)// 取消注册unregisterReceiver(receiver)实战应用场景1事件总线// 简单的事件总线classEventBus{privatevalobserversmutableMapOfString,MutableList(Any)-Unit()funregister(event:String,observer:(Any)-Unit){observers.getOrPut(event){mutableListOf()}.add(observer)}fununregister(event:String,observer:(Any)-Unit){observers[event]?.remove(observer)}funpost(event:String,data:Any){observers[event]?.forEach{it(data)}}companionobject{valinstancebylazy{EventBus()}}}// 使用classMainActivity:AppCompatActivity(){privatevalloginObserver:(Any)-Unit{data-valuserdataasUser Toast.makeText(this,Welcome${user.name},Toast.LENGTH_SHORT).show()}overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)EventBus.instance.register(login,loginObserver)}overridefunonDestroy(){super.onDestroy()EventBus.instance.unregister(login,loginObserver)}}// 发布事件EventBus.instance.post(login,User(Alice))场景2数据仓库观察// 数据仓库classUserRepository{privateval_usersMutableLiveDataListUser()valusers:LiveDataListUser_userssuspendfunrefreshUsers(){valusersapi.fetchUsers()_users.postValue(users)}}// ViewModelclassUserListViewModel(privatevalrepository:UserRepository):ViewModel(){valusersrepository.usersfunrefresh(){viewModelScope.launch{repository.refreshUsers()}}}// ActivityclassUserListActivity:AppCompatActivity(){privatevalviewModel:UserListViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)viewModel.users.observe(this){users-adapter.submitList(users)}swipeRefreshLayout.setOnRefreshListener{viewModel.refresh()}}}常见问题Q1LiveData vs Flow// LiveData生命周期感知但功能有限valliveDataMutableLiveDataString()liveData.observe(this){value-println(value)}// Flow更强大支持操作符valflowflow{emit(Hello)delay(1000)emit(World)}lifecycleScope.launch{flow.collect{value-println(value)}}对比特性LiveDataFlow生命周期感知是否需手动背压处理否是操作符有限丰富线程切换简单灵活冷/热流热流默认冷流Q2如何避免LiveData的粘性事件// [未通过] 默认行为新观察者立即收到最新值liveData.observe(this){value-// 即使是旧值也会触发}// [通过] 使用SingleLiveEventclassSingleLiveEventT:MutableLiveDataT(){privatevalpendingAtomicBoolean(false)overridefunobserve(owner:LifecycleOwner,observer:ObserverinT){super.observe(owner){t-if(pending.compareAndSet(true,false)){observer.onChanged(t)}}}overridefunsetValue(t:T?){pending.set(true)super.setValue(t)}}Q3观察者模式 vs 发布-订阅模式观察者模式Subject直接通知ObserverSubject → Observer1 → Observer2发布-订阅模式通过EventBus解耦Publisher → EventBus → Subscriber1 → Subscriber2区别观察者耦合度高Subject知道Observer发布-订阅解耦Publisher不知道Subscriber总结核心思想一对多依赖关系Subject维护Observer列表状态改变时通知所有ObserverAndroid中的应用LiveData- MVVM架构核心ContentObserver- 数据库变化监听BroadcastReceiver- 系统事件监听选择建议UI相关 → LiveData生命周期感知复杂数据流 → Flow操作符丰富系统事件 → BroadcastReceiver跨组件通信 → EventBus观察者模式是响应式编程的基础LiveData和Flow都是它的现代实现。
01-16-12 观察者模式 - LiveData与ContentObserver的观察者实现
发布时间:2026/6/23 17:34:32
01-16-12 观察者模式 - LiveData与ContentObserver的观察者实现观察者模式是什么定义对象间的一对多依赖关系当一个对象状态改变时所有依赖它的对象都会收到通知。核心要点Subject被观察者维护观察者列表负责通知Observer观察者接收通知做出响应解耦Subject和Observer通过接口交互Android源码中的观察者实现案例1LiveData - 生命周期感知观察者源码位置androidx/lifecycle/LiveData.javapublicabstractclassLiveDataT{privateSafeIterableMapObserver?superT,ObserverWrappermObserversnewSafeIterableMap();privateintmActiveCount0;privatevolatileObjectmData;privateintmVersion;// 注册观察者生命周期感知publicvoidobserve(NonNullLifecycleOwnerowner,NonNullObserver?superTobserver){if(owner.getLifecycle().getCurrentState()DESTROYED){return;}LifecycleBoundObserverwrappernewLifecycleBoundObserver(owner,observer);ObserverWrapperexistingmObservers.putIfAbsent(observer,wrapper);if(existing!null!existing.isAttachedTo(owner)){thrownewIllegalArgumentException(Cannot add the same observer with different lifecycles);}if(existing!null){return;}owner.getLifecycle().addObserver(wrapper);}// 注册观察者永久观察publicvoidobserveForever(NonNullObserver?superTobserver){AlwaysActiveObserverwrappernewAlwaysActiveObserver(observer);ObserverWrapperexistingmObservers.putIfAbsent(observer,wrapper);if(existinginstanceofLifecycleBoundObserver){thrownewIllegalArgumentException(Cannot add the same observer with different lifecycles);}if(existing!null){return;}wrapper.activeStateChanged(true);}// 移除观察者publicvoidremoveObserver(NonNullfinalObserver?superTobserver){ObserverWrapperremovedmObservers.remove(observer);if(removednull){return;}removed.detachObserver();removed.activeStateChanged(false);}// 设置值主线程protectedvoidsetValue(Tvalue){mVersion;mDatavalue;dispatchingValue(null);}// 设置值后台线程protectedvoidpostValue(Tvalue){booleanpostTask;synchronized(mDataLock){postTaskmPendingDataNOT_SET;mPendingDatavalue;}if(!postTask){return;}ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);}// 通知观察者voiddispatchingValue(NullableObserverWrapperinitiator){if(mDispatchingValue){mDispatchInvalidatedtrue;return;}mDispatchingValuetrue;do{mDispatchInvalidatedfalse;if(initiator!null){considerNotify(initiator);initiatornull;}else{for(IteratorMap.EntryObserver?superT,ObserverWrapperiteratormObservers.iteratorWithAdditions();iterator.hasNext();){considerNotify(iterator.next().getValue());if(mDispatchInvalidated){break;}}}}while(mDispatchInvalidated);mDispatchingValuefalse;}privatevoidconsiderNotify(ObserverWrapperobserver){if(!observer.mActive){return;}if(!observer.shouldBeActive()){observer.activeStateChanged(false);return;}if(observer.mLastVersionmVersion){return;}observer.mLastVersionmVersion;observer.mObserver.onChanged((T)mData);}// 生命周期感知包装器classLifecycleBoundObserverextendsObserverWrapperimplementsLifecycleEventObserver{NonNullfinalLifecycleOwnermOwner;LifecycleBoundObserver(NonNullLifecycleOwnerowner,Observer?superTobserver){super(observer);mOwnerowner;}OverridebooleanshouldBeActive(){returnmOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);}OverridepublicvoidonStateChanged(NonNullLifecycleOwnersource,NonNullLifecycle.Eventevent){Lifecycle.StatecurrentStatemOwner.getLifecycle().getCurrentState();if(currentStateDESTROYED){removeObserver(mObserver);return;}Lifecycle.StateprevStatenull;while(prevState!currentState){prevStatecurrentState;activeStateChanged(shouldBeActive());currentStatemOwner.getLifecycle().getCurrentState();}}OverridebooleanisAttachedTo(LifecycleOwnerowner){returnmOwnerowner;}OverridevoiddetachObserver(){mOwner.getLifecycle().removeObserver(this);}}}为什么这么设计生命周期感知自动在Activity/Fragment销毁时移除观察者避免内存泄漏粘性事件新观察者注册时立即收到最新值线程安全postValue支持后台线程更新数据使用示例// ViewModel中定义LiveDataclassUserViewModel:ViewModel(){privateval_userMutableLiveDataUser()valuser:LiveDataUser_userfunloadUser(){viewModelScope.launch{valuseruserRepository.getUser()_user.valueuser// 主线程// _user.postValue(user) // 后台线程}}}// Activity中观察classMainActivity:AppCompatActivity(){privatevalviewModel:UserViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)// 观察LiveData生命周期感知viewModel.user.observe(this){user-// UI更新nameTextView.textuser.name ageTextView.textuser.age.toString()}viewModel.loadUser()}}案例2ContentObserver - 数据库观察者publicabstractclassContentObserver{privatefinalObjectmLocknewObject();privateTransportmTransport;// IContentObserver的Binder实现HandlermHandler;publicContentObserver(Handlerhandler){mHandlerhandler;}// 注册观察publicfinalvoiddispatchChange(booleanselfChange){dispatchChange(selfChange,null);}publicfinalvoiddispatchChange(booleanselfChange,Uriuri){if(mHandlernull){onChange(selfChange,uri);}else{mHandler.post(newNotificationRunnable(selfChange,uri));}}// 子类实现publicvoidonChange(booleanselfChange){// 默认实现}publicvoidonChange(booleanselfChange,Uriuri){onChange(selfChange);}privatefinalclassNotificationRunnableimplementsRunnable{privatefinalbooleanmSelfChange;privatefinalUrimUri;publicNotificationRunnable(booleanselfChange,Uriuri){mSelfChangeselfChange;mUriuri;}Overridepublicvoidrun(){ContentObserver.this.onChange(mSelfChange,mUri);}}}// ContentResolver注册/取消注册publicabstractclassContentResolver{publicfinalvoidregisterContentObserver(Uriuri,booleannotifyForDescendants,ContentObserverobserver){registerContentObserver(uri,notifyForDescendants,observer,UserHandle.myUserId());}publicfinalvoidunregisterContentObserver(ContentObserverobserver){// 移除观察者}// 通知观察者publicvoidnotifyChange(Uriuri,ContentObserverobserver){notifyChange(uri,observer,true);}}使用示例// 观察联系人变化classContactObserver(handler:Handler):ContentObserver(handler){overridefunonChange(selfChange:Boolean,uri:Uri?){Log.d(ContactObserver,Contact changed:$uri)// 重新查询联系人loadContacts()}}// 注册观察者valobserverContactObserver(Handler(Looper.getMainLooper()))contentResolver.registerContentObserver(ContactsContract.Contacts.CONTENT_URI,true,// notifyForDescendantsobserver)// 取消注册contentResolver.unregisterContentObserver(observer)案例3BroadcastReceiver - 系统事件观察// 观察网络状态classNetworkReceiver:BroadcastReceiver(){overridefunonReceive(context:Context,intent:Intent){valconnectivityManagercontext.getSystemService(Context.CONNECTIVITY_SERVICE)asConnectivityManagervalnetworkInfoconnectivityManager.activeNetworkInfovalisConnectednetworkInfo!nullnetworkInfo.isConnected Log.d(NetworkReceiver,Network connected:$isConnected)}}// 注册接收器valreceiverNetworkReceiver()valfilterIntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)registerReceiver(receiver,filter)// 取消注册unregisterReceiver(receiver)实战应用场景1事件总线// 简单的事件总线classEventBus{privatevalobserversmutableMapOfString,MutableList(Any)-Unit()funregister(event:String,observer:(Any)-Unit){observers.getOrPut(event){mutableListOf()}.add(observer)}fununregister(event:String,observer:(Any)-Unit){observers[event]?.remove(observer)}funpost(event:String,data:Any){observers[event]?.forEach{it(data)}}companionobject{valinstancebylazy{EventBus()}}}// 使用classMainActivity:AppCompatActivity(){privatevalloginObserver:(Any)-Unit{data-valuserdataasUser Toast.makeText(this,Welcome${user.name},Toast.LENGTH_SHORT).show()}overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)EventBus.instance.register(login,loginObserver)}overridefunonDestroy(){super.onDestroy()EventBus.instance.unregister(login,loginObserver)}}// 发布事件EventBus.instance.post(login,User(Alice))场景2数据仓库观察// 数据仓库classUserRepository{privateval_usersMutableLiveDataListUser()valusers:LiveDataListUser_userssuspendfunrefreshUsers(){valusersapi.fetchUsers()_users.postValue(users)}}// ViewModelclassUserListViewModel(privatevalrepository:UserRepository):ViewModel(){valusersrepository.usersfunrefresh(){viewModelScope.launch{repository.refreshUsers()}}}// ActivityclassUserListActivity:AppCompatActivity(){privatevalviewModel:UserListViewModelbyviewModels()overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)viewModel.users.observe(this){users-adapter.submitList(users)}swipeRefreshLayout.setOnRefreshListener{viewModel.refresh()}}}常见问题Q1LiveData vs Flow// LiveData生命周期感知但功能有限valliveDataMutableLiveDataString()liveData.observe(this){value-println(value)}// Flow更强大支持操作符valflowflow{emit(Hello)delay(1000)emit(World)}lifecycleScope.launch{flow.collect{value-println(value)}}对比特性LiveDataFlow生命周期感知是否需手动背压处理否是操作符有限丰富线程切换简单灵活冷/热流热流默认冷流Q2如何避免LiveData的粘性事件// [未通过] 默认行为新观察者立即收到最新值liveData.observe(this){value-// 即使是旧值也会触发}// [通过] 使用SingleLiveEventclassSingleLiveEventT:MutableLiveDataT(){privatevalpendingAtomicBoolean(false)overridefunobserve(owner:LifecycleOwner,observer:ObserverinT){super.observe(owner){t-if(pending.compareAndSet(true,false)){observer.onChanged(t)}}}overridefunsetValue(t:T?){pending.set(true)super.setValue(t)}}Q3观察者模式 vs 发布-订阅模式观察者模式Subject直接通知ObserverSubject → Observer1 → Observer2发布-订阅模式通过EventBus解耦Publisher → EventBus → Subscriber1 → Subscriber2区别观察者耦合度高Subject知道Observer发布-订阅解耦Publisher不知道Subscriber总结核心思想一对多依赖关系Subject维护Observer列表状态改变时通知所有ObserverAndroid中的应用LiveData- MVVM架构核心ContentObserver- 数据库变化监听BroadcastReceiver- 系统事件监听选择建议UI相关 → LiveData生命周期感知复杂数据流 → Flow操作符丰富系统事件 → BroadcastReceiver跨组件通信 → EventBus观察者模式是响应式编程的基础LiveData和Flow都是它的现代实现。