最近我聽到不少人提到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線程回調主線程,一次計算線程回調主線程。