好吧 看起来流程很简单很简单,那么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然后做后续操作。 观察者有了,被观察者也有了,现在关联起来。
observable.subscribe(consumer);好了,一次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线程回调主线程,一次计算线程回调主线程。
新闻热点
疑难解答