最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、簡(jiǎn)介

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

二、使用場(chǎng)景

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

三、簡(jiǎn)單實(shí)現(xiàn)

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

 //被觀察者
 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)我們?cè)谑褂肔istView或RecycleView時(shí)如果數(shù)據(jù)發(fā)生變化我們會(huì)調(diào)用Adapter的notifyDataSetChanged()方法,如下所示

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

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

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是一個(gè)抽類這里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)點(diǎn):

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

缺點(diǎn):

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

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

相關(guān)文章

  • Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱

    Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)環(huán)信修改頭像和昵稱,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • flutter 動(dòng)手?jǐn)]一個(gè)城市選擇citypicker功能

    flutter 動(dòng)手?jǐn)]一個(gè)城市選擇citypicker功能

    在一些項(xiàng)目開發(fā)中經(jīng)常會(huì)用到城市選擇器功能,今天小編動(dòng)手?jǐn)]一個(gè)基于flutter 城市選擇citypicker功能,具體實(shí)現(xiàn)過程跟隨小編一起看看吧
    2021-08-08
  • 在kotlin的安卓項(xiàng)目中使用dagger的操作方法

    在kotlin的安卓項(xiàng)目中使用dagger的操作方法

    在 Kotlin 的 Android 項(xiàng)目中使用 ??Dagger??(特別是 ??Dagger Hilt??,官方推薦的簡(jiǎn)化版)進(jìn)行依賴注入(DI)可以大幅提升代碼的可測(cè)試性和模塊化程度,這篇文章主要介紹了在kotlin的安卓項(xiàng)目中使用dagger的相關(guān)操作,需要的朋友可以參考下
    2025-04-04
  • 基于Android Service 生命周期的詳細(xì)介紹

    基于Android Service 生命周期的詳細(xì)介紹

    本篇文章小編為大家介紹,基于Android Service 生命周期的詳解。需要的朋友參考下
    2013-04-04
  • Android高仿微信5.2.1主界面及消息提醒

    Android高仿微信5.2.1主界面及消息提醒

    這篇文章主要為大家詳細(xì)介紹了Android高仿微信5.2.1主界面及消息提醒,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例

    Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例

    這篇文章主要介紹了Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例,本文講解實(shí)現(xiàn)用一張背景圖做循環(huán)從左往右平移動(dòng)畫,需要的朋友可以參考下
    2015-06-06
  • Android實(shí)現(xiàn)一個(gè)帶粘連效果的LoadingBar

    Android實(shí)現(xiàn)一個(gè)帶粘連效果的LoadingBar

    Loading效果相信大家應(yīng)該都實(shí)現(xiàn)過,最近發(fā)現(xiàn)了一個(gè)不錯(cuò)的效果,決定分享給大家,所以下面這篇文章主要給大家介紹了關(guān)于利用Android實(shí)現(xiàn)一個(gè)帶粘連效果的LoadingBar的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Android UI實(shí)現(xiàn)廣告Banner輪播效果

    Android UI實(shí)現(xiàn)廣告Banner輪播效果

    這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)廣告Banner輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • BroadcastReceiver動(dòng)態(tài)注冊(cè)案例詳解

    BroadcastReceiver動(dòng)態(tài)注冊(cè)案例詳解

    這篇文章主要為大家詳細(xì)介紹了BroadcastReceiver動(dòng)態(tài)注冊(cè)案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android自定義Material進(jìn)度條效果

    Android自定義Material進(jìn)度條效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義Material進(jìn)度條效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論

泽库县| 虹口区| 石柱| 昆山市| 邢台县| 防城港市| 富川| 太仆寺旗| 夹江县| 桃园县| 太湖县| 株洲市| 盐亭县| 大渡口区| 中江县| 上犹县| 惠来县| 株洲县| 锦州市| 全南县| 巩留县| 苗栗市| 剑阁县| 南通市| 贵阳市| 蓬安县| 康平县| 东明县| 从化市| 沂源县| 旺苍县| 社会| 南华县| 拉孜县| 东明县| 布尔津县| 建水县| 建德市| 社会| 上思县| 凤城市|