Android中的观察者DataSetObservable和DataSetObserver

本文详细介绍了Observable模式在Android开发中的应用,包括其基本原理、关键代码解析以及在Adapter中的具体使用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Observable是观察者模式的典型应用。在Android下,Observable是一个泛型的抽象类,表示一个观察者对象,提供了观察者注册、反注册及清空三个方法,其源码如下:

[java] view plain copy
  1. publicabstractclassObservable<T>{
  2. protectedfinalArrayList<T>mObservers=newArrayList<T>();
  3. publicvoidregisterObserver(Tobserver){
  4. if(observer==null){
  5. thrownewIllegalArgumentException("Theobserverisnull.");
  6. }
  7. synchronized(mObservers){
  8. if(mObservers.contains(observer)){
  9. thrownewIllegalStateException("Observer"+observer+"isalreadyregistered.");
  10. }
  11. mObservers.add(observer);
  12. }
  13. }
  14. publicvoidunregisterObserver(Tobserver){
  15. if(observer==null){
  16. thrownewIllegalArgumentException("Theobserverisnull.");
  17. }
  18. synchronized(mObservers){
  19. intindex=mObservers.indexOf(observer);
  20. if(index==-1){
  21. thrownewIllegalStateException("Observer"+observer+"wasnotregistered.");
  22. }
  23. mObservers.remove(index);
  24. }
  25. }
  26. publicvoidunregisterAll(){
  27. synchronized(mObservers){
  28. mObservers.clear();
  29. }
  30. }
  31. }
Observable的直接继承者有两个:DataSetObservable和ContentObservable。ContentObservable实现比较复杂,不过功能与DataSetObservable类似,这里只讲解DataSetObservable。

DataSetObservable在很多的Adapter中都用到,像BaseAdapter。DataSetObservable使用DataSetObserver实例化了Observable。DataSetObserver表示了一个数据集对象的观察者,主要提供了两个方法:

[java] view plain copy
  1. publicabstractclassDataSetObserver{
  2. publicvoidonChanged(){
  3. //Donothing
  4. }
  5. publicvoidonInvalidated(){
  6. //Donothing
  7. }
  8. }

DataSetObservable实现如下:

[java] view plain copy
  1. publicclassDataSetObservableextendsObservable<DataSetObserver>{
  2. publicvoidnotifyChanged(){
  3. synchronized(mObservers){
  4. for(DataSetObserverobserver:mObservers){
  5. observer.onChanged();
  6. }
  7. }
  8. }
  9. publicvoidnotifyInvalidated(){
  10. synchronized(mObservers){
  11. for(DataSetObserverobserver:mObservers){
  12. observer.onInvalidated();
  13. }
  14. }
  15. }
  16. }

当数据集有变化时,会调用DataSetObserver的onChanged()方法;当数据集失效时,会调用DataSetObserver的onINvalidated()方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值