RxJava入門實踐③

最近大家都在學習RXJAVA,作為有理想(mei shi gan)的程序員,RxJava還是沈有必要學習下的。

RXJAVA地址: https://github.com/ReactiveX/RxJava

0.什么是觀察者模式

1.RXJAVA是什么

在RxJava 中,Scheduler ——調度器,相當于線程控制器,RxJava 通過它來指定每一段代碼應該運行在什么樣的線程。RxJava 已經內置了幾個 Scheduler ,它們已經適合大多數的使用場景:

Schedulers.immediate():直接在當前線程運行,相當于不指定線程。這是默認的 Scheduler。

Schedulers.newThread():總是啟用新線程,并在新線程執行操作。

Schedulers.io():I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區別在于 io() 的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下 io() 比 newThread() 更有效率。不要把計算工作放在 io() 中,可以避免創建不必要的線程。

Schedulers.computation():計算所使用的 Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個 Scheduler 使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時間會浪費 CPU。

另外, Android 還有一個專用的 AndroidSchedulers.mainThread() ,它指定的操作將在 Android 主線程運行。

另外使用AndroidSchedulers.mainThread()需要添加

compile ‘io.reactivex:rxandroid:1.1.0’的依賴有了這幾個 Scheduler ,就可以使用 subscribeOn() 和 observeOn() 兩個方法來對線程進行控制了。 * subscribeOn(): 指定 subscribe() 所發生的線程,即 Observable.OnSubscribe 被激活時所處的線程。或者叫做事件產生的線程。 * observeOn(): 指定 Subscriber 所運行在的線程。或者叫做事件消費的線程。

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        //做有些耗時或者運算操作
        int i = 2 << 20;//位運算模擬運算操作
        subscriber.onNext(i + "");
        subscriber.onCompleted();
    }

});


observable
        .subscribeOn(Schedulers.computation())//指定運算在運算線程
        .observeOn(AndroidSchedulers.mainThread())//指定訂閱者在主線程執行結果
        .subscribe(subscriber);

指定訂閱者執行

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onCompleted() {
        Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onNext(String s) {
        Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();

    }
};

如下圖所示:

當然如果你是進行網絡操作或者是耗時的文件操作你可以

Schedulers.io():來指定被訂閱者工作的線程為io線程

 

來自: http://blog.flyou.ren/?p=271

 本文由用戶 102827 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!