Rxjava

RxJava

  • Rx是Reactive Extensions的簡寫,翻譯為響應的擴展。也就是通過由一方發出信息,另一方響應信息並作出處理的核心框架代碼。該框架由微軟的架構師Erik Meijer領導的團隊開發,並在2012年11月開源。
  • Rx庫支持.NET、JavaScript和C++等,現在已經支持幾乎全部的流行程式語言了。
  • Rx的大部分語言庫由ReactiveX這個組織負責維護,比較流行的有RxJava/RxJS/Rx.NET,社區網站是reactivex.io。
  • RxJava作為一個流行的框架,其源碼依託在GitHub,除了支持RxJava,針對安卓系統也除了一個支持框架RxAndroid

Rxjava_第1张图片使用時機
異步處理

為何使用
與AysncTask與Handler相較下程式碼簡潔,可讀性高,可控制的狀態多

使用方式
使用Grandle方式加入依賴Rxjava依賴:

//RxJava
compile 'io.reactivex.rxjava2:rxjava:2.1.5'
//RxAndroid
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

RxJava基本用法

1.創建觀察者Observer

Observer observer = new Observer() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {
    }
    @Override
    public void onNext(@NonNull String s) {
        Logger.d(s);
    }
    @Override
    public void onError(@NonNull Throwable e) {
        Logger.d(e.getMessage());
    }
    @Override
    public void onComplete() {
        Logger.d("***onComplete***");
    }
};

2.創建被觀察者Observable

Observable observable = Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(@NonNull ObservableEmitter e) throws Exception {
        //加入兩個事件
        e.onNext("dayongxin");
        e.onNext("DoubleDa");
        e.onComplete();
    }
});

3.執行與創建訂閱

observable.subscribe(observer);

4.整合使用範例

Observable.create(new ObservableOnSubscribe() {
    @Override
    public void subscribe(@NonNull ObservableEmitter e) throws Exception {
        e.onNext("dayongxin");
        e.onNext("DoubleDa");
        e.onComplete();
    }
}).subscribe(new Observer() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {
    }
    @Override
    public void onNext(@NonNull String s) {
        Logger.d(s);
    }
    @Override
    public void onError(@NonNull Throwable e) {
        Logger.d(e.getMessage());
    }
    @Override
    public void onComplete() {
        Logger.d("***onComplete***");
    }
});

一些常用操作符----

5.定時Task
建立一個按照固定時間間格發射整數序列的Observable,相當於定時器。

Observable.interval(5, TimeUnit.SECONDS).subscribe(new Observer() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {
    }
    @Override
    public void onNext(@NonNull Long aLong) {
        Logger.d(aLong);
    }
    @Override
    public void onError(@NonNull Throwable e) {
    }
    @Override
    public void onComplete() {
    }
});

6.zip
zip操作碼並且兩個或多個Observable發射出的數據項,根據指定的函數變換它們,並發射一個新值。

Observable observable1 = Observable.just("a", "b", "c");
Observable observable2 = Observable.just(1, 2, 3);
Observable.zip(observable1, observable2, new BiFunction() {
    @Override
    public String apply(@NonNull String s, @NonNull Integer integer) throws Exception {
        return s + integer;
    }
}).subscribe(new Observer() {
    @Override
    public void onSubscribe(@NonNull Disposable d) {
    }
    @Override
    public void onNext(@NonNull String s) {
       //Do something..
    }
    @Override
    public void onError(@NonNull Throwable e) {
    }
    @Override
    public void onComplete() {
    }
});

7.Scheduler

Scheduler:線程控制器,可以指定每一段代碼在什麼樣的線程中行為。
在RxJava中,存在一個未指定的線程情況,默認會使用當前線程,若是操作中有耗时的操作,會導致線程阻塞。

如何使用Scheduler控制線程:

  1. Schedulers.immediate(): 直接在當前線程運行,相當於不指定線程。這是默認的 Scheduler。
  2. Schedulers.newThread(): 總是啟用新線程,並在新線程執行操作。
  3. Schedulers.io(): I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。行為模式和
    newThread() 差不多,區別在於 io() 的內部實現是是用一個無數量上限的線程池,可以重用空閒的線程,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免創建不必要的線程。
  4. Schedulers.computation(): 計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被
    I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的線程池,大小為 CPU 核數。不要把 I/O
    操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。
  5. Android 還有一個專用的 AndroidSchedulers.mainThread(),它指定的操作將在 Android
    主線程運行。

Sample:

  private void rxHelloWord() {
        Observable.just("Hello", "RxWord!")
                .subscribeOn(Schedulers.newThread())//指定 subscribe() 發生在新的線程
                .observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回調發生在主線程
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

你可能感兴趣的:(Android)