欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Android觀察者模式的使用與優(yōu)劣

 更新時間:2020年09月08日 09:36:38   作者:Robin132929  
這篇文章主要介紹了Android觀察者模式的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Android的設(shè)計模式,感興趣的朋友可以了解下

一、簡介

觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。該模式一個重要作用就是解耦,將被觀察者和觀察者進(jìn)行解耦,使他們之間的依賴性更小

二、使用場景

關(guān)聯(lián)行為場景,需要注意的是關(guān)聯(lián)行為是可拆分的而不是“組合”關(guān)系
事件多級觸發(fā)場景
跨系統(tǒng)的消息交換場景,如消息隊列、事件總線的處理機(jī)制

三、簡單實現(xiàn)

這里我們以微信公眾號的訂閱為例。公眾號當(dāng)其更新內(nèi)容時就會推送給訂閱了該公眾號的讀者。

 //被觀察者
 public class Wechat extends Observable{
  public void postNewPublication(String content){
   setChanged();
   notifyObservers(content);
  }
 }

 //觀察者
 public class Reader implements Observer{
  public String name ;

  public Reader(String name) {
   this.name = name;
  }

  @Override
  public void update(Observable o, Object arg) {
   Log.i(TAG, "update: wechat is update content is :"+arg);
  }
 }
 
 public void test(){
  Wechat wechat=new Wechat();
  
  Reader reader1=new Reader("reader1");
  Reader reader2=new Reader("reader2");
  Reader reader3=new Reader("reader3");
  
  wechat.addObserver(reader1);
  wechat.addObserver(reader2);
  wechat.addObserver(reader3);
  
  wechat.postNewPublication("up up up");
 }

這里需要注意的是Observer和Observable是JDK內(nèi)置的類,表示觀察者和被觀察者。

四、觀察者模式在Android中應(yīng)用

ListView和RecycleView 的notifyDataSetChanged

當(dāng)我們在使用ListView或RecycleView時如果數(shù)據(jù)發(fā)生變化我們會調(diào)用Adapter的notifyDataSetChanged()方法,如下所示

 public void notifyDataSetChanged() {
  mDataSetObservable.notifyChanged();
 }

在方法內(nèi)部調(diào)用了mDataSetObservable.notifyChanged,這里的mDataSetObservable是一個DataSetObservable實例

private final DataSetObservable mDataSetObservable = new DataSetObservable();

而DataSetObservable繼承自O(shè)bservable,我們看下DataSetObservable的notifyChanged方法

public class DataSetObservable extends Observable<DataSetObserver> {

public void notifyChanged() {
  synchronized(mObservers) {
   for (int i = mObservers.size() - 1; i >= 0; i--) {
    mObservers.get(i).onChanged();
   }
  }
 }
 }

可以看到調(diào)用了DataSetObserver的onChanged方法,DataSetObserver是一個抽類這里mObservers.get(i)獲得的是其子類AdapterDataSetObserver.

class AdapterDataSetObserver extends DataSetObserver {
  private Parcelable mInstanceState = null;
  @Override
  public void onChanged() {
   mDataChanged = true;
   mOldItemCount = mItemCount;
   mItemCount = getAdapter().getCount();
   if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
     && mOldItemCount == 0 && mItemCount > 0) {
    AdapterView.this.onRestoreInstanceState(mInstanceState);
    mInstanceState = null;
   } else {
    rememberSyncState();
   }
   checkFocus();
   //重新布局
   requestLayout();
  }

  ...

  public void clearSavedState() {
   mInstanceState = null;
  }
 }

可以看到在AdapterDataSetObserver的onChanged方法中調(diào)用了requestLayout來進(jìn)行重新布局。

BroadcastReceiver

在Android中廣播也是基于觀察者模式的

五、小結(jié)

觀察者模式優(yōu)點:

  • 解耦觀察者與被觀察者,應(yīng)對業(yè)務(wù)變化
  • 增強(qiáng)系統(tǒng)靈活性、可擴(kuò)展性

缺點:

在使用時要考慮開發(fā)效率和運行效率,程序中包括一個被觀察者、多個觀察者、開發(fā)調(diào)試等內(nèi)容會比較復(fù)雜,且Java中消息通知默認(rèn)是順序執(zhí)行,如果一個觀察者卡頓,那么會影響整體執(zhí)行效率,在這種情況下一般考慮使用異步的方式。

以上就是詳解Android觀察者模式的使用與優(yōu)劣的詳細(xì)內(nèi)容,更多關(guān)于Android 觀察者模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Flutter?runApp到渲染上屏分析詳解

    Flutter?runApp到渲染上屏分析詳解

    這篇文章主要為大家介紹了Flutter?runApp到渲染上屏分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Android中WebView加載網(wǎng)頁設(shè)置進(jìn)度條

    Android中WebView加載網(wǎng)頁設(shè)置進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android中WebView加載網(wǎng)頁設(shè)置進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android應(yīng)用程序(APK)的編譯打包過程

    Android應(yīng)用程序(APK)的編譯打包過程

    本篇文章主要介紹了Android應(yīng)用程序(APK)的編譯打包過程,具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Android圖像處理之繪制圓形、三角形及扇形的頭像

    Android圖像處理之繪制圓形、三角形及扇形的頭像

    這篇文章主要給大家介紹了Android圖像處理之繪制圓形、三角形及扇形頭像的相關(guān)資料,文中給出了詳細(xì)的代碼示例,通過學(xué)會了文中的方法,就不局限于圓形頭像了,剛興趣的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-04-04
  • android實現(xiàn)音樂播放器

    android實現(xiàn)音樂播放器

    這篇文章主要為大家詳細(xì)介紹了android實現(xiàn)音樂播放器,擁有播放、暫停、重新播放和停止等功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Android仿微信底部菜單欄效果

    Android仿微信底部菜單欄效果

    這篇文章主要為大家詳細(xì)介紹了Android仿微信底部菜單欄效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Android自定義View實現(xiàn)仿1號店垂直滾動廣告條代碼

    Android自定義View實現(xiàn)仿1號店垂直滾動廣告條代碼

    這篇文章主要介紹了Android自定義View實現(xiàn)仿1號店垂直滾動廣告條代碼,實現(xiàn)步驟及實現(xiàn)原理本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-01-01
  • Android實現(xiàn)流光和光影移動效果代碼

    Android實現(xiàn)流光和光影移動效果代碼

    大家好,本篇文章主要講的是Android實現(xiàn)流光和光影移動效果代碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android App啟動圖啟動界面(Splash)的簡單實現(xiàn)代碼

    Android App啟動圖啟動界面(Splash)的簡單實現(xiàn)代碼

    這篇文章主要介紹了Android App啟動圖啟動界面(Splash)的簡單實現(xiàn)代碼,本文通過實例圖文詳解相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • Android自定義ListView實現(xiàn)下拉刷新

    Android自定義ListView實現(xiàn)下拉刷新

    這篇文章主要為大家詳細(xì)介紹了Android自定義ListView實現(xiàn)下拉刷新的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07

最新評論