RxJava 初探

這裏寫圖片描述

目錄

入門教程推薦

  1. RxJava、Retrofit
    http://www.jianshu.com/p/19cac3c5b106
    http://gank.io/post/560e15be2dca930e00da1083
    https://gank.io/post/56e80c2c677659311bed9841

  2. RxJava 操作符
    http://blog.csdn.net/job_hesc/article/details/46242117
    https://www.apkdv.com/rxjava-operator-classification/
    ReactiveX中文翻譯文檔(這個特別推薦)
    https://mcxiaoke.gitbooks.io/rxdocs/content/index.html

RxJava的觀察者模式關係

RxJava 有四個基本概念:Observable (可觀察者,即被觀察者)、 Observer (觀察者)、 subscribe (訂閱)、事件。Observable 和 Observer 通過 subscribe() 方法實現訂閱關係,從而 Observable 可以在需要的時候發出事件來通知 Observer。

Observer 即觀察者,它決定事件觸發的時候將有怎樣的行爲
Observable 即被觀察者,它決定什麼時候觸發事件以及觸發怎樣的事件

eg.

警察    :觀察者
小偷    :被觀察者

警察已經在小偷住的房間周圍佈滿了監控,監視着小偷(訂閱),只要小偷作案了(什麼時候觸發,觸發做什麼案件),就會被警察發現,警察就自然會開啓抓捕行動(小偷的作案的事件觸發了他,將會採取抓捕行動)。

大概就這樣。

RxJava 與常規用法簡明對比

假設有這樣一個需求:界面上有一個自定義的視圖 imageCollectorView ,它的作用是顯示多張圖片,並能使用 addImage(Bitmap) 方法來任意增加顯示的圖片。現在需要程序將一個給出的目錄數組 File[] folders 中每個目錄下的 png 圖片都加載出來並顯示在imageCollectorView 中。需要注意的是,由於讀取圖片的這一過程較爲耗時,需要放在後臺執行,而圖片的顯示則必須在 UI 線程執行。常用的實現方式有多種,其中一種:

new Thread() {
@Override
public void run() {
super.run();
        for (File folder : folders) {
File[] files = folder.listFiles();
            for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
                    });
}
            }
        }
    }
}.start();

而如果使用 RxJava ,實現方式是這樣的:

Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});

顯然,哪個用的爽,只有自己才知道~

初步使用

添加依賴

    //rxjava
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'

打印機個字符串

public class MainActivity extends Activity {

    private final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 創建一個觀察者
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onCompleted() {
                // TODO Auto-generated method stub
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable arg0) {
                // TODO Auto-generated method stub
                Log.i(TAG, "onError");
            }

            @Override
            public void onNext(String s) {
                // TODO Auto-generated method stub
                Log.i(TAG, s);
            }

        };

        // 使用Observable.create()創建被觀察者
        Observable observable1 = Observable
                .create(new Observable.OnSubscribe<String>() {

                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        // TODO Auto-generated method stub
                        subscriber.onNext("Hello");
                        subscriber.onNext("Wrold");
                        subscriber.onCompleted();
                    }

                });
        // 訂閱
        observable1.subscribe(observer);
    }

}

以上用到的都是rx包裏面的,別用錯了!!!

運行結果:
這裏寫圖片描述

這就初步使用到了RxJava

說點什麼吧

最近在學習一些聽了很久,可就只是聽到的時候去搜索一番的知識,例如Retrofit/RxJava/mvp等等。

這裏只是在學習Rx的時候,我記錄的入門的第一步。接下來會繼續上詳細學習的筆記,和Demo~

請看下回分解~這裏寫圖片描述

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