Rxjava 了解篇

實(shí)踐才是真道理!實(shí)踐才是真道理!實(shí)踐才是真道理!

Rxjava 是什么?

異步,還是異步,還是異步!重復(fù)三遍幫助記憶,哈哈哈。

Rxjava 優(yōu)點(diǎn) ?

簡(jiǎn)潔,還是簡(jiǎn)潔,還是簡(jiǎn)潔!

理解
handler、asyncTask是android提供的異步操作,我們通常配合回調(diào)來(lái)實(shí)現(xiàn),而Rxjava是通過(guò)一個(gè)擴(kuò)展的觀察者模式來(lái)現(xiàn)實(shí)的,支持鏈?zhǔn)秸{(diào)用,不需要回調(diào)來(lái)實(shí)現(xiàn),從而一目了然,并且更好的維護(hù)。

簡(jiǎn)潔的與眾不同之處:隨著程序邏輯變得越來(lái)越復(fù)雜,它依然能夠保持簡(jiǎn)潔。

Rxjava 如何實(shí)現(xiàn)異步

RxJava 的異步實(shí)現(xiàn),是通過(guò)一種擴(kuò)展的觀察者模式來(lái)實(shí)現(xiàn)的。

觀察者模式

RxJava 有四個(gè)基本概念:

1: Observable (被觀察者)
2: Observer (觀察者)
3: subscribe (訂閱)
4: 事件

Observable 和 Observer 通過(guò) subscribe() 方法實(shí)現(xiàn)訂閱關(guān)系,從而 Observable 可以在需要的時(shí)候發(fā)出事件來(lái)通知 Observer。

就是:被觀察者訂閱觀察者,被觀察者發(fā)生事件通知觀察者?。ㄓ悬c(diǎn)繞理解理解,哈哈。)

Paste_Image.png

基本實(shí)現(xiàn)

1: 觀察者Observer

Observer是個(gè)抽象類(lèi),Subscriber是觀察者observer的實(shí)現(xiàn),它們的使用是一樣的。

Observer<String> observer = new Observer<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

Subscriber<String> subscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

2: 被觀察者

創(chuàng)建被觀察者Observable有幾種方式,如下:

1:使用 create() 方法來(lái)創(chuàng)建

Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
    @Override
    public void call(Subscriber<? super String> subscriber) {
        subscriber.onNext("Hello");
        subscriber.onNext("Hi");
        subscriber.onNext("Aloha");
        subscriber.onCompleted();
    }
});

可以看到,這里傳入了一個(gè) OnSubscribe 對(duì)象作為參數(shù)。OnSubscribe 會(huì)被存儲(chǔ)在返回的 Observable 對(duì)象中,它的作用相當(dāng)于一個(gè)計(jì)劃表,當(dāng) Observable 被訂閱的時(shí)候,OnSubscribe 的 call() 方法會(huì)自動(dòng)被調(diào)用,事件序列就會(huì)依照設(shè)定依次觸發(fā)(對(duì)于上面的代碼,就是觀察者Subscriber 將會(huì)被調(diào)用三次 onNext() 和一次 onCompleted())。這樣,由被觀察者調(diào)用了觀察者的回調(diào)方法,就實(shí)現(xiàn)了由被觀察者向觀察者的事件傳遞,即觀察者模式。

just(T...)創(chuàng)建被觀察者Observable: 將傳入的參數(shù)依次發(fā)送出來(lái)。

Observable observable = Observable.just("Hello", "Hi", "Aloha");
// 將會(huì)依次調(diào)用:
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();

from(T[]) / from(Iterable<? extends T>) : 將傳入的數(shù)組或 Iterable 拆分成具體對(duì)象后,依次發(fā)送出來(lái)。

String[] words = {"Hello", "Hi", "Aloha"};
Observable observable = Observable.from(words);
// 將會(huì)依次調(diào)用:
// onNext("Hello");
// onNext("Hi");
// onNext("Aloha");
// onCompleted();

3:訂閱Subscribe

observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);

那么一個(gè)完整的是這樣的:

//創(chuàng)建Observable
Observable.create(new Observable.OnSubscribe<Integer>() {

    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        for (int i = 0; i < 5; i++) {
            subscriber.onNext(i);
        }
        subscriber.onCompleted();
    }

}).subscribe(new Observer<Integer>() {//訂閱方法,調(diào)用創(chuàng)建的Observer

    @Override
    public void onCompleted() {
        System.out.println("onCompleted");
    }

    @Override
    public void onError(Throwable e) {
        System.out.println("onError");
    }

    @Override
    public void onNext(Integer item) {
        System.out.println("Item is " + item);
    }
});

異步

上面簡(jiǎn)單的調(diào)用,木有實(shí)現(xiàn)異步哦,而Rxjava最重要的不是異步嗎!RxJava 遵循的是線程不變的原則,即:在哪個(gè)線程調(diào)用 subscribe(),就在哪個(gè)線程生產(chǎn)事件;在哪個(gè)線程生產(chǎn)事件,就在哪個(gè)線程消費(fèi)事件。如果需要切換線程,就需要用到 Scheduler (調(diào)度器)。

Rxjava 提供了幾個(gè)Scheduler如下:

  • Schedulers.immediate(): 直接在當(dāng)前線程運(yùn)行,相當(dāng)于不指定線程。這是默認(rèn)的 Scheduler。
  • Schedulers.newThread(): 總是啟用新線程,并在新線程執(zhí)行操作。
  • Schedulers.io(): I/O 操作(讀寫(xiě)文件、讀寫(xiě)數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)信息交互等)所使用的 Scheduler。行為模式和 newThread() 差不多,區(qū)別在于 io() 的內(nèi)部實(shí)現(xiàn)是是用一個(gè)無(wú)數(shù)量上限的線程池,可以重用空閑的線程,因此多數(shù)情況下 io() 比 newThread() 更有效率。不要把計(jì)算工作放在 io() 中,可以避免創(chuàng)建不必要的線程。
  • Schedulers.computation(): 計(jì)算所使用的 Scheduler。這個(gè)計(jì)算指的是 CPU 密集型計(jì)算,即不會(huì)被 I/O 等操作限制性能的操作,例如圖形的計(jì)算。這個(gè) Scheduler 使用的固定的線程池,大小為 CPU 核數(shù)。不要把 I/O 操作放在 computation() 中,否則 I/O 操作的等待時(shí)間會(huì)浪費(fèi) CPU。
  • AndroidSchedulers.mainThread():它指定的操作將在 Android 主線程運(yùn)行。

那么如何調(diào)用呢?代碼如下:

Observable.just(1, 2, 3, 4)
    .subscribeOn(Schedulers.io()) // 指定 subscribe() 發(fā)生在 IO 線程
    .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回調(diào)發(fā)生在主線程
    .subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer number) {
            Log.d(tag, "number:" + number);
        }
    });

其中的兩個(gè)方法subscribeOn() 和 observeOn() 兩個(gè)方法來(lái)對(duì)線程進(jìn)行控制了。

  • subscribeOn(): 指定 subscribe() 所發(fā)生的線程,即 Observable.OnSubscribe 被激活時(shí)所處的線程?;蛘呓凶鍪录a(chǎn)生的線程。

  • observeOn(): 指定 Subscriber 所運(yùn)行在的線程。或者叫做事件消費(fèi)的線程。

subscribeOn() 方法 --- 被觀察者事件的線程

observeOn() 方法 --- 觀察者事件的線程

上面這段代碼中,由于 subscribeOn(Schedulers.io()) 的指定,被創(chuàng)建的事件的內(nèi)容 1、2、3、4 將會(huì)在 IO 線程發(fā)出;而由于 observeOn(AndroidScheculers.mainThread()) 的指定,因此 subscriber 數(shù)字的打印將發(fā)生在主線程 。事實(shí)上,這種在 subscribe() 之前寫(xiě)上兩句 subscribeOn(Scheduler.io()) 和 observeOn(AndroidSchedulers.mainThread()) 的使用方式非常常見(jiàn),它適用于多數(shù)的 『后臺(tái)線程取數(shù)據(jù),主線程顯示』的程序策略。

好了,RxJava基本了解就是這些。下面這樣學(xué)習(xí)相關(guān)的API和操作符,并以實(shí)踐為基礎(chǔ)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我從去年開(kāi)始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy閱讀 5,759評(píng)論 7 62
  • 前言我從去年開(kāi)始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占導(dǎo)zqq閱讀 9,311評(píng)論 6 151
  • 文章轉(zhuǎn)自:http://gank.io/post/560e15be2dca930e00da1083作者:扔物線在正...
    xpengb閱讀 7,133評(píng)論 9 73
  • 我今年大二,在一所還不錯(cuò)的一本大學(xué)上學(xué)。我每天一個(gè)人占座,一個(gè)人吃飯,一個(gè)人逛街??吹绞矣衙恐艽虬绲钠亮梁湍?..
    聰慧如你q閱讀 248評(píng)論 0 2
  • 有生之年,我一直堅(jiān)持做三件事:認(rèn)真的看《奇葩說(shuō)》,一如既往的愛(ài)閱讀,始終如一的堅(jiān)持夢(mèng)想。 看《奇葩說(shuō)》是這么多年來(lái)...
    快雪時(shí)清閱讀 399評(píng)論 0 3

友情鏈接更多精彩內(nèi)容