RxAndroid響應式開發
Rx含義是響應式程式設計,其本質就是觀察者模式,以觀察者(Observer)和訂閱者(Subscriber)為基礎的非同步響應方式。
Observables發出一系列事件,Subscribers處理這些事件。這裡的事件可以是任何你感興趣的東西(觸控事件,非同步介面呼叫返回的資料等)
Rx模式以及優點
使用觀察者模式
1、建立:Rx可以方便的建立事件流和資料流
2、組合:Rx使用查詢式的操作符和變換資料流
3、監聽:Rx可以訂閱任何可觀察的資料流並執行操作
簡化程式碼
1、Rx的操作符可以將複雜的難題簡化為很少的幾行程式碼
2、非同步錯誤處理,傳統的try/catch沒法處理非同步計算,Rx提供了合適的錯誤處理機制
3、輕鬆使用併發,Rx的Observables和Schedulers讓開發者可以擺脫底層的執行緒同步和各種併發問題
RxJava
觀察者模式面向的需求是:A 物件(觀察者)對 B 物件(被觀察者)的某種變化高度敏感,需要在 B 變化的一瞬間做出反應。
程式的觀察者模式和這種真正的『觀察』略有不同,觀察者不需要時刻盯著被觀察者(例如 A 不需要每過 2ms 就檢查一次 B 的狀
態),而是採用註冊(Register)或者稱為訂閱(Subscribe)的方式,告訴被觀察者:我需要你的某某狀態,你要在它變化的時候通知
我。 Android 開發中一個比較典型的例子是點選監聽器OnClickListener
OnClickListener
來說, View
是被觀察者,
OnClickListener
是觀察者,二者通過setOnClickListener()
方法達成訂閱關係。訂閱之後使用者點選按鈕的瞬間,Android
Framework 就會將點選事件傳送給已經註冊的OnClickListener
。採取這樣被動的觀察方式,既省去了反覆檢索狀態的資源消耗,
也能夠得到最高的反饋速度。當然,這也得益於我們可以隨意定製自己程式中的觀察者和被觀察者,而警察叔叔明顯無法要求小偷
『你在作案的時候務必通知我』。
RxJava四個基本概念:Observable(被觀察者)、Observer(觀察者)、subscribe(訂閱)、事件。
Observable和Observer通過subscribe()方法實現訂閱關係,從而Observable可以在需要的時候發出事件來通知Observer。
配置:
compile 'io.reactivex:rxjava:1.2.0' compile 'io.reactivex:rxandroid:1.2.1'DEMO:
/** * 被觀察者介面 */ public interface Watched { /** * 新增觀察者 * @param watcher */ void addWatcher(Watcher watcher); /** * 刪除觀察者 * @param watcher */ void removeWatcher(Watcher watcher); /** * 提醒所有的觀察者 * @param str */ void notifyWatchers(String str); }
/** * 抽象主題角色 * Created by Administrator on 2017/11/3. */ /** * 被觀察者實現類 */ public class CreateWatched implements Watched { //儲存新增的觀察者物件 private List<Watcher> list = new ArrayList<>(); @Override public void addWatcher(Watcher watcher) { list.add(watcher); } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher); } @Override public void notifyWatchers(String str) { //此處就是,當被觀察者發生變化時,通知觀察者進行響應 for (Watcher watcher : list) { watcher.update(str); } } }
/** * 觀察者介面 */ public interface Watcher { /** * 接收被觀察者變化的通知 * * @param str */ void update(String str); }
/** * 觀察者實現類 */ public class CreateWatcher implements Watcher { @Override public void update(String str) { System.out.println(str); } }
/** * 測試 * 這樣把觀察者訂閱給被觀察者,當被觀察者發生變化時,依次通知與它繫結的觀察者 * Created by Administrator on 2017/11/3. */ public class TestObservable { public static void main(String[] args) { Watched xiaoming = new CreateWatched();// 被觀察者 Watcher watcher = new CreateWatcher();// 觀察者 Watcher watcher1 = new CreateWatcher(); Watcher watcher2 = new CreateWatcher(); xiaoming.addWatcher(watcher); xiaoming.addWatcher(watcher1); xiaoming.addWatcher(watcher2); xiaoming.removeWatcher(watcher1); xiaoming.notifyWatchers("我要偷東西了"); } }