国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

詳解Android觀察者模式的使用與優劣

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

一、簡介

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

二、使用場景

關聯行為場景,需要注意的是關聯行為是可拆分的而不是“組合”關系事件多級觸發場景跨系統的消息交換場景,如消息隊列、事件總線的處理機制

三、簡單實現

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

//被觀察者 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內置的類,表示觀察者和被觀察者。

四、觀察者模式在Android中應用

ListView和RecycleView 的notifyDataSetChanged

當我們在使用ListView或RecycleView時如果數據發生變化我們會調用Adapter的notifyDataSetChanged()方法,如下所示

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

在方法內部調用了mDataSetObservable.notifyChanged,這里的mDataSetObservable是一個DataSetObservable實例

private final DataSetObservable mDataSetObservable = new DataSetObservable();

而DataSetObservable繼承自Observable,我們看下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(); } } } }

可以看到調用了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方法中調用了requestLayout來進行重新布局。

BroadcastReceiver

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

五、小結

觀察者模式優點:

解耦觀察者與被觀察者,應對業務變化 增強系統靈活性、可擴展性

缺點:

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

以上就是詳解Android觀察者模式的使用與優劣的詳細內容,更多關于Android 觀察者模式的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 久久精品二三区 | 欧美aaaa在线观看视频免费 | 国内欧美一区二区三区 | 99精品国产免费久久国语 | 兔子先生节目在线观看免费 | 麻豆69堂免费视频 | 亚洲欧美字幕 | 国产精品三级a三级三级午夜 | 国产一级大片在线观看 | 日韩 综合| 老司机午夜精品网站在线观看 | 成年人黄视频在线观看 | 精品视频在线一区 | 国产在线精品一区二区不卡 | 国产第九页| 国产精品国产精品国产三级普 | 在线视频一区二区三区 | 中文字幕成人免费高清在线 | 日韩美女一级毛片a | 91精品久久久久久久久网影视 | 国产一区成人 | 中国人免费观看高清在线观看二区 | a级片免费观看 | 韩国免费毛片 | 波野多衣在线观 | 国产私拍福利精品视频推出 | 中文字幕一区二区三区 精品 | 欧美曰批人成在线观看 | 亚洲精品视频免费 | 国产激情一区二区三区成人91 | 鲁丝片一区二区三区免费 | 性欧美另类老妇高清 | 一级做人爱a视频正版免费 一级做性色a爱片久久片 | 国产一区不卡 | 国产日产欧美精品一区二区三区 | 成人免费真人毛片视频 | 中文字幕亚洲国产 | 自拍视频在线 | 免费人成在线观看 | 日韩欧美中文字幕在线观看 | 亚洲国产精品成人久久 |