rxjava 學習

rxjava  學習

1. 對象介紹

Observable 即被觀察者 
Observer 和 Subscriber 即觀察者  (onStart()  和  unsubscribe() 是subscriber 增加的方法)
Observable 有行爲上的改變後,通過  Observer 傳入的方法進行調用,通知觀察者


2.被觀察者 observable的兩個方法的介紹

just(T...): 將傳入的參數依次發送出來。
Observable observable = Observable.just("Hello", "Hi", "Aloha");

from(T[]) / from(Iterable<? extends T>) : 將傳入的數組或 Iterable 拆分成具體對象後,依次發送出來。
String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);

3.觀察者與被觀察者的實現源碼查看

observable 調用 observer的訂閱的原代碼
Observable.subscribe(Subscriber) 的內部實現是這樣的(僅核心代碼):
public Subscription subscribe(Subscriber subscriber) {
    subscriber.onStart();
    onSubscribe.call(subscriber);
    return subscriber;
}

其中調用了 observer的  onstart() 並將subscriber返回給observable的call()的方法

在這個過程中使先調用subscriber的onstart的方法進行初始化一些數據,而後通過,onsubscriber。call()進行回調
調用subscriber中的 onnect()和oncompleted()的方法


4.例子  ( 觀察者模式的實現 )

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {   //設置了回調
    @Override
    public void call(Subscriber<? super Drawable> subscriber) {  //回調的是  subscribe()中設置的observer
        Drawable drawable = getTheme().getDrawable(drawableRes));
        subscriber.onNext(drawable);   //調用observer中的next()
        subscriber.onCompleted();
    }
}).subscribe(new Observer<Drawable>() {
    @Override
    public void onNext(Drawable drawable) {//next()被上面調用
        imageView.setImageDrawable(drawable);
    }

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    }
});


5.線程控制  --  Scheduler(調度器)

在 RxJava 的默認規則中,事件的發出和消費都是在同一個線程的。也就是說,如果只用上面的方法,
實現出來的只是一個同步的觀察者模式。觀察者模式本身的目的就是『後臺處理,前臺回調』的異步機制,
因此異步對於 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 主線程運行。

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


例子  

int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
    @Override
    public void call(Subscriber<? super Drawable> subscriber) {
        Drawable drawable = getTheme().getDrawable(drawableRes));
        subscriber.onNext(drawable);
        subscriber.onCompleted();
    }
})
.subscribeOn(Schedulers.io()) // 指定 subscribe() 發生在 IO 線程,即subscriber()調用的call()方法發送在io線程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回調 即subscriber調用的方法onnext()發生在主線程
.subscribe(new Observer<Drawable>() {
    @Override
    public void onNext(Drawable drawable) {
        imageView.setImageDrawable(drawable);
    }

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
        Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
    }
});



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章