天天看點

在android中使用rxjava rxAndroid

最近我聽到不少人提到rxJava,但是在實際項目中并沒有見到,看了一些部落格文檔,也看的不太明白,于是拿起Android Studio,先撸一個demo看看。
rxjava使用的是觀察者模式。
Observable 被觀察者
Observer 觀察者
Observable 和 Observer 通過 subscribe 關聯起來。
           

好吧 看起來流程很簡單很簡單,那麼demo走起來。

demo為從sd卡中讀取一張圖檔,在imageView中顯示出來,然後做模糊,顯示到另一個imageView中.

在build.gradle中引入

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
           

這裡就不貼關于模糊的代碼了。直接上rx相關的代碼。

建立一個被觀察者,傳入一個參數–檔案位址 dir

Observable observable = Observable.just(dir).map(new Function<String, Bitmap>() {
        @Override
        public Bitmap apply(String s) throws Exception {
            return getBitmap(s);
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread());
           

map方法的參數function制定了被觀察者的行為,兩個泛型參數,第一個為傳入的參數類型,第二個為傳回的參數類型。

subscribeOn(Schedulers.io())方法制定了被觀察者的行為發生在io線程。

observeOn(AndroidSchedulers.mainThread())觀察者的行為發生在android的主線程(ui線程);

然後建立一個觀察者。

Consumer<Bitmap> consumer = new Consumer<Bitmap>() {
        @Override
        public void accept(Bitmap bitmap) throws Exception {
            iv.setImageBitmap(bitmap);
            fileBitmap = bitmap ;
            blur(bitmap);
        }
    };
           

Consumer為一個觀察者類,接收bitmap然後做後續操作。

觀察者有了,被觀察者也有了,現在關聯起來。

好了,一次rx異步回調完成了,但是我們還沒有做照片模糊處理。模糊應該在io之後,就是上面調用的 blur(bitmap) 方法

private void blur(Bitmap bitmap) {
        Observable blurOjservable = Observable.just(bitmap)
            .map(new Function<Bitmap, Bitmap>() {
            @Override
            public Bitmap apply(Bitmap bitmap) throws Exception {
                return boxBlurFilter(bitmap);
            }
        })
        .subscribeOn(Schedulers.computation())
        .observeOn(AndroidSchedulers.mainThread());

        Consumer<Bitmap> blurConsumer = new Consumer<Bitmap>() {
            @Override
            public void accept(Bitmap bitmap) throws Exception {
                blur_iv.setImageBitmap(bitmap);
                gaosiBitmap = bitmap ;
            }
        };

        blurOjservable.subscribe(blurConsumer);
    }
           

再一次使用rxjava完成了異步操作,這一次的模糊計算發生在

Schedulers.computation()

線程,

Schedulers.computation()

線程用于計算操作,不能在其中做io操作,會阻塞cpu,影響cpu的效率。

一個rxjava demo就完成了,一共兩次回調,一次io線程回調主線程,一次計算線程回調主線程。