久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:7日期:2022-09-22 16:05:59

一、簡(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來(lái)進(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)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 午夜看片 | 亚洲专区中文字幕 | a欧美| 日本一本视频 | 国产精品一区二区三区四区五区 | 超碰av在线 | 99影视 | 国产精品二区三区 | 亚洲第一黄 | 久久久综合网 | 人人人人澡 | 一本一道久久a久久精品综合 | 色精品| 成人在线视频一区二区 | 国产精品中文字幕在线 | 国产精品久久久久久久久 | 欧美一区不卡 | 国产精品成人国产乱一区 | 午夜爱视频 | 国产视频99 | 亚洲 成人 av | 国产中文字幕在线 | 日本三级在线网站 | 亚洲一区视频 | 午夜网| 日韩在线观看 | 欧美一区二区另类 | 国产三级黄色毛片 | 国产一区亚洲二区三区 | 欧美精品二区中文乱码字幕高清 | 欧美不卡一区二区 | 免费毛片网站 | 精品国产乱码久久久久久1区2区 | 我看午夜视频 | 国产欧美在线观看 | 婷婷五月色综合 | 国产毛片毛片 | 国产精品日韩在线观看 | 国产成人精品免高潮在线观看 | 一区二区久久久 | 91亚洲国产成人久久精品网站 |