最近刚刚接触RxJava还没有更深层次的了解,这里只是随笔记录自己的理解
在Android开发项目中有一些比较耗时的操作,比如加载图片bitmap,网络请求,大文件处理等等,如果这些耗时操作放到主线程中会出现ANR现象导致程序无响应。RxJava相对与其他异步操作的类AsyncTask / Handler有啥好处 ,好处就是简洁,如下:
如果我要加载一个图片的Bitmap ,然后将bitmap在IamgView上面展示
/**
* 使用Observable根据图片路径加载bitmap
*
*/
Observable.just(imagePath) .map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
Bitmap bmp = loadBitmap(s);
return bmp;
}
})
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程;
.subscribe(new Subscriber<Bitmap>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
ToastUtil.show("图片加载失败");
}
@Override
public void onNext(Bitmap bitmap) {
if (bitmap != null) {
identificationResultImgFront.setImageBitmap(bitmap);
identificationResultImgFront.setScaleType(ImageView.ScaleType.FIT_CENTER);
}
}
});
}
/**
* 根据图片路径加载bitmap
*
* @param pathName
* @return
*/
private Bitmap loadBitmap(String pathName) {
Bitmap b = null;
try {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.RGB_565;
b = BitmapFactory.decodeFile(pathName, opts);
} catch (Exception e) {
e.printStackTrace();
b = null;
} catch (OutOfMemoryError e) {
e.printStackTrace();
b = null;
}
return b;
}
加载bitmap是一个耗时操作 这样就可以完美的避免在主线程里面做耗时操作出现程序无响应的问题。
比较好的文章链接如下
网友评论