溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android中怎么實(shí)現(xiàn)觀察者模式

發(fā)布時(shí)間:2021-06-26 15:55:38 來源:億速云 閱讀:143 作者:Leah 欄目:移動(dòng)開發(fā)

Android中怎么實(shí)現(xiàn)觀察者模式,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

1.意圖
定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個(gè)對象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對象都得到通知并被自動(dòng)更新。
熱門詞匯:依賴  發(fā)布-訂閱 事件 通知 更新 監(jiān)聽

2.結(jié)構(gòu)

Android中怎么實(shí)現(xiàn)觀察者模式
這是一個(gè)最簡單的觀察者模式,目標(biāo)對象能夠添加和刪除觀察者,當(dāng)自己某種狀態(tài)或者行為發(fā)生改變時(shí),可通過notify通知注冊的觀察者進(jìn)行更新操作。
分析AbstractCursor的具體情況,我們發(fā)現(xiàn)實(shí)際工作有時(shí)需要對觀察者進(jìn)行統(tǒng)一管理,甚至觀察者類型有很多種而又可以分成幾個(gè)系列,這個(gè)時(shí)候是要復(fù)雜的多,通過合理的分層這個(gè)問題很好解決。下面根據(jù)具體情況,我們畫出android中abstractCurosr中用到的觀察者模式結(jié)構(gòu)圖:

Android中怎么實(shí)現(xiàn)觀察者模式
觀察者分成了兩個(gè)系列。

3.代碼
列舉其中相關(guān)核心代碼如下:

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<T>類和DataSetObservable類:

public abstract class Observable<T> {      /**       * 觀察者列表       */     protected final ArrayList<T> mObservers = new ArrayList<T>();         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<DataSetObserver> {      /**       * 數(shù)據(jù)發(fā)生變化時(shí),通知所有的觀察者       */     public void notifyChanged() {          synchronized(mObservers) {              for (DataSetObserver observer : mObservers) {                  observer.onChanged();              }          }      }      //... ... (其他方法)  }

觀察者DataSetObserver類是一個(gè)抽象類:

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

所以我們具體看它的子類:

public class AlphabetIndexer extends DataSetObserver{      /*       * @hide 被android系統(tǒng)隱藏起來了       */     @Override     public void onChanged() {          //觀察到數(shù)據(jù)變化,觀察者做自己該做的事情          super.onChanged();          mAlphaMap.clear();      }  }

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI