重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

Android中怎么实现观察者模式

Android中怎么实现观察者模式,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

10多年的南谯网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整南谯建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“南谯网站设计”,“南谯网站推广”以来,每个客户项目都认真落实执行。

1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
热门词汇:依赖  发布-订阅 事件 通知 更新 监听

2.结构

Android中怎么实现观察者模式
这是一个最简单的观察者模式,目标对象能够添加和删除观察者,当自己某种状态或者行为发生改变时,可通过notify通知注册的观察者进行更新操作。
分析AbstractCursor的具体情况,我们发现实际工作有时需要对观察者进行统一管理,甚至观察者类型有很多种而又可以分成几个系列,这个时候是要复杂的多,通过合理的分层这个问题很好解决。下面根据具体情况,我们画出android中abstractCurosr中用到的观察者模式结构图:

Android中怎么实现观察者模式
观察者分成了两个系列。

3.代码
列举其中相关核心代码如下:

public abstract class AbstractCursor {      //定义管理器      DataSetObservable mDataSetObservable = new DataSetObservable();      ContentObservable mContentObservable = new ContentObservable();             //注册和卸载两类观察者      public void registerContentObserver(ContentObserver observer) {          mContentObservable.registerObserver(observer);      }         public void unregisterContentObserver(ContentObserver observer) {          // cursor will unregister all observers when it close          if (!mClosed) {              mContentObservable.unregisterObserver(observer);          }      }         public void registerDataSetObserver(DataSetObserver observer) {          mDataSetObservable.registerObserver(observer);                 }         public void unregisterDataSetObserver(DataSetObserver observer) {          mDataSetObservable.unregisterObserver(observer);      }         //2类通知方法      protected void onChange(boolean selfChange) {          synchronized (mSelfObserverLock) {              mContentObservable.dispatchChange(selfChange);              if (mNotifyUri != null && selfChange) {                  mContentResolver.notifyChange(mNotifyUri, mSelfObserver);              }          }      }         protected void notifyDataSetChange() {          mDataSetObservable.notifyChanged();      }  }

再看看Observable类和DataSetObservable类:

public abstract class Observable {      /**       * 观察者列表       */     protected final ArrayList mObservers = new ArrayList();         public void registerObserver(T observer) {          if (observer == null) {              throw new IllegalArgumentException("The observer is null.");          }          synchronized(mObservers) {              if (mObservers.contains(observer)) {                  throw new IllegalStateException("Observer " + observer + " is already registered.");              }              mObservers.add(observer);          }      }            public void unregisterObserver(T observer) {          if (observer == null) {              throw new IllegalArgumentException("The observer is null.");          }          synchronized(mObservers) {              int index = mObservers.indexOf(observer);              if (index == -1) {                  throw new IllegalStateException("Observer " + observer + " was not registered.");              }              mObservers.remove(index);          }      }             public void unregisterAll() {          synchronized(mObservers) {              mObservers.clear();          }              }  }

public class DataSetObservable extends Observable {      /**       * 数据发生变化时,通知所有的观察者       */     public void notifyChanged() {          synchronized(mObservers) {              for (DataSetObserver observer : mObservers) {                  observer.onChanged();              }          }      }      //... ... (其他方法)  }

观察者DataSetObserver类是一个抽象类:

public abstract class DataSetObserver {      public void onChanged() {          // Do nothing      }  }

所以我们具体看它的子类:

public class AlphabetIndexer extends DataSetObserver{      /*       * @hide 被android系统隐藏起来了       */     @Override     public void onChanged() {          //观察到数据变化,观察者做自己该做的事情          super.onChanged();          mAlphaMap.clear();      }  }

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。


本文标题:Android中怎么实现观察者模式
文章路径:http://cqcxhl.com/article/gopsdh.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP