1. 程式人生 > >RxAndroid響應式開發

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("我要偷東西了");
    }
}