RxJava入門(mén)記錄篇

RxJava 在 GitHub 主頁(yè)上的自我介紹是 "a library for composing asynchronous and event-based programs using observable sequences for the Java VM"(一個(gè)在 Java VM 上使用可觀測(cè)的序列來(lái)組成異步的、基于事件的程序的庫(kù))。

參考博客:http://gank.io/post/560e15be2dca930e00da1083
http://www.lxweimin.com/p/5e93c9101dc5

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

本文針對(duì)的rxjava:1.0.14版本的,在moulde中的build.gradledependencies中添加如下依賴(lài)

    compile 'io.reactivex:rxjava:1.0.14'
    compile 'io.reactivex:rxandroid:1.0.1'

基本概念梳理

在Rxjava中,典型的思想就是就是觀察者模式,如果對(duì)其不是其他熟悉的話(huà),建議參考博客。
下面直接先介紹一些基本的概念。


**Observable **:英語(yǔ)翻譯為:可觀察的。在Rxjava中,Observable被用作可觀察的對(duì)象。(可以這么理解,在button.setOnClick(new OnClickListener(){;;;})中,Observable對(duì)象就類(lèi)似于button,即被監(jiān)聽(tīng)的對(duì)象)
Observer:英語(yǔ)翻譯為:觀察者。同翻譯一樣,Observer就是來(lái)充當(dāng)觀察者的角色的,可以接收來(lái)自于Observable發(fā)送的數(shù)據(jù)(類(lèi)似于button.setOnClick(new OnClickListener(){;;;})中的new OnClickListener{;;;},即要實(shí)現(xiàn)的動(dòng)作)
Subscriber:英語(yǔ)翻譯為:訂閱者。Observer的增強(qiáng)版,主要功能同Observer,但相對(duì)Observer,subscriber多了一些方法。如取消訂閱
unsubscribe( )。一般來(lái)說(shuō),使用的比較多的是Subscriber。建議使用Subscriber來(lái)當(dāng)作觀察者。

最基礎(chǔ)的概念弄清楚了,接下來(lái)的代碼就好理解了。

最簡(jiǎn)單的使用樣例。

都說(shuō)使用Rxjava可以使的代碼的思路變得很清晰,那么首先嘗試使用Rxjava來(lái)解決一些問(wèn)題把。
eg:嘗試將一張圖片顯示在imageView中。

public class NextActivity extends AppCompatActivity {

    private ImageView mImageView;

    private int drawRes = R.mipmap.ic_launcher;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);

        mImageView = (ImageView) findViewById(R.id.imageview);

        Observable observable = Observable.just(drawRes);
        //創(chuàng)建Observable對(duì)象,這里使用just創(chuàng)建,傳入圖片的id。

        observable.subscribe(subscriber);
        //綁定服務(wù),通過(guò)subscribe將observale和subsciber連接起來(lái)。
    }

  //創(chuàng)建訂閱者,實(shí)現(xiàn)具體邏輯
    Subscriber<Integer> subscriber = new Subscriber<Integer>() {
        @Override
        public void onCompleted() {
            //完成之后執(zhí)行的回調(diào)
        }

        @Override
        public void onError(Throwable e) {
            //發(fā)生錯(cuò)誤時(shí)執(zhí)行的回調(diào)
        }

        @Override
        public void onNext(Integer o) {
            //普通事件,發(fā)出就需要執(zhí)行完畢
            mImageView.setImageResource(o);
        }
    };
}

運(yùn)行上面的代碼后,會(huì)發(fā)現(xiàn)image會(huì)正常的顯示在imageview中。下面對(duì)其中的一些代碼進(jìn)行補(bǔ)充說(shuō)明。

Observable的創(chuàng)建

Observable 即被觀察者,他決定了什么時(shí)候觸發(fā)事件已經(jīng)觸發(fā)什么樣的事件。下面幾種創(chuàng)建Observable的方法。

** 1. 利用create來(lái)創(chuàng)造 **

  Observable observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(123);
               subscriber.onNext(1223);
                subscriber.onCompleted();
            }
        });

使用onSubscibe對(duì)象作為參數(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)了由被觀察者向觀察者的事件傳遞,即觀察者模式。

** 2. 利用just(T ···)快捷創(chuàng)建**

Observable observable = Observable.just(123,1223);

just會(huì)將參數(shù)依次發(fā)送給subscibe

3. 利用from(T ```)快捷創(chuàng)建

  Integer[] ids = {123,1223};
  Observable observable1 = Observable.from(ids);

from會(huì)將將傳入的數(shù)據(jù)或者Iterable拆分成具體對(duì)象后,依次發(fā)送。

上面1、2、3三種創(chuàng)建方法在效果上是等效的。

Observer的創(chuàng)建

Observer即觀察者,它決定事件觸發(fā)時(shí)候?qū)?huì)有怎么樣的行為。Rxjava創(chuàng)建Observer的方式如下:

 Observer<Integer> observer  = new Observer <Integer>(){

        @Override
        public void onCompleted() {
            
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Integer integer) {

        }
    };

對(duì)于Observer,Rxjava還提供了功能更加強(qiáng)大的Subscriber進(jìn)行實(shí)現(xiàn)。通過(guò)Subscriber可以實(shí)現(xiàn)對(duì)Observer的擴(kuò)展。

 Subscriber<Integer> subscriber = new Subscriber<Integer>() {
        @Override
        public void onCompleted() {
            //完成之后執(zhí)行的回調(diào)
        }

        @Override
        public void onError(Throwable e) {
            //發(fā)生錯(cuò)誤時(shí)執(zhí)行的回調(diào)
        }

        @Override
        public void onNext(Integer o) {
            //普通事件,發(fā)出就需要執(zhí)行完畢
            mImageView.setImageResource(o);
        }

        @Override
        public void onStart() {
            super.onStart();
            //開(kāi)始之前的準(zhǔn)備工作在這里執(zhí)行(在Subscriber增加的方法)
        }
    };

其實(shí)兩者的差別并不大,基本的使用方式一樣。下面介紹以下兩者之間細(xì)小的差別。

  1. Observer完全可以用 Subscriber來(lái)代替,事實(shí)上,Observer也是通過(guò)Subscriber來(lái)實(shí)現(xiàn)的,可以將Observer看做是簡(jiǎn)單化的Subscriber。
  2. Subscriber添加在onStart()方法。。它會(huì)在 subscribe 剛開(kāi)始,而事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作,例如數(shù)據(jù)的清零或重置。這是一個(gè)可選方法,默認(rèn)情況下它的實(shí)現(xiàn)為空。
    3.unsubscribe()Subscriber實(shí)現(xiàn)的另一個(gè)接口。用于取消訂閱。所以在這個(gè)方法調(diào)用之前,最好需要先使用isUnsubscribed()先判斷一下?tīng)顟B(tài),避免內(nèi)存泄露。

創(chuàng)建關(guān)聯(lián)

     observable.subscribe(subscriber);
  // observable.subscribe(observer);

將訂閱者和觀察者關(guān)聯(lián)起來(lái)很簡(jiǎn)單,一行打碼就解決了。

至此,創(chuàng)建一個(gè)簡(jiǎn)單的Rxjava模式的代碼鏈就整理完畢。現(xiàn)在還沒(méi)有看出Rxjava的威力,因?yàn)槲覀兡壳斑€只是簡(jiǎn)單的使用他顯示一張圖片而已。下面先介紹Rxjava更加簡(jiǎn)便的使用,下一篇博客介紹Rxjava真正牛逼的地方。

不完整的回調(diào)的實(shí)現(xiàn)

上面介紹的都是完整的回調(diào)實(shí)現(xiàn),事實(shí)上,Rxjava為我們提供了更加方便快捷的不完整回調(diào),Rxjava會(huì)自動(dòng)創(chuàng)建Subscriber
形如:

 Action0 action0 = new Action0() {
     @Override
     public void call() {
         //要執(zhí)行的回調(diào)
     }
 };

// 自動(dòng)創(chuàng)建 Subscriber ,并使用action0 來(lái)定義 onNext()
observable.subscribe(action0);

Rxjava提供了10個(gè)Action,分別從Action0到Action9,后面的0-9代碼這Action有幾個(gè)參數(shù),如果帶有兩個(gè)參數(shù)的話(huà),可以這么寫(xiě):

   Action2<String ,Integer> action2 = new Action2<String, Integer>() {
       @Override
       public void call(String s, Integer integer) {
           //要執(zhí)行的回調(diào)
       }
   };

完整的實(shí)例:打印字符串?dāng)?shù)組。

String[] names = ...;
Observable.from(names)
    .subscribe(new Action1<String>() {
        @Override
        public void call(String name) {
            Log.d(tag, name);
        }
    });

至此,對(duì)Rxjava應(yīng)該已經(jīng)有了一個(gè)初步的了解,下一篇博客將介紹Rxjava真正強(qiáng)大的地方。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容