学习的博文:
扔物线-给Android 开发者的 RxJava 详解
tough1985-RxJava 与 Retrofit 结合的最佳实践
大头鬼rxjava系列译文
以上我都还没啃完。。所以就只会简单的使用…之前就是看一下丢一下,现在慢慢重新学习感谢给我讲课的大大。先看一下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);
}
});
上面的代码是为了实现一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView 中。
这里的from,flatMap,filter,map返回的都是观察者。
from
作用:将传入的数组或 Iterable 拆分成具体对象后,依次发送出来。说道from可以提一下just。都是转换成具体的Observable对象,但是just只可以放多个单独的元素,但from可以直接放集合,数组。其实从just的代码中可以发现,最终还是会通过from将单个的元素组合是集合来使用,所以just最红还是走的from。
public final static <T> Observable<T> just(T t1, T t2, T t3) {
return from(Arrays.asList(t1, t2, t3));
}
看一下from的代码,就是遍历所以的元素然后依次转换成observable对象输出。
public final static <T> Observable<T> from(Iterable<? extends T> iterable) {
return create(new OnSubscribeFromIterable<T>(iterable));
}
public final static <T> Observable<T> create(OnSubscribe<T> f) {
return new Observable<T>(hook.onCreate(f));
}
测试
String arr[] =new String[]{"1","22","333"};
Observable.just("1", "22", "333").subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i("yqy", "just:输出:" + s);
}
});
Observable.from(arr).subscribe(new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
Log.i("yqy", "from:输出:" + s);
}
});
Log打印:
just:输出:1
just:输出:22
just:输出:333
from:输出:1
from:输出:22
from:输出:333
flatMap和Map
两者都是为了将某一个对象转转成另一个对象返回。比如上面的代码,flaMap是将file转换成一个Observable。从From到flatmap最终return Observable.from(file.listFiles())观察者从整个文件夹到一个文件,最后到文件里的所有文件。Map就是简单的将一个对象转换成另一个对象,这里的具体转换可以用户自己定义。
filter
从名字我们就可以看出这个的功能是过滤。并且最终都会转换成true或者false。如果是true就可以继续向下执行否则不执行。上述代码是为了过滤所有文件中以”.png”为扩展名的文件。
subscribeOn和observeOn
Rxjava是用了发布订阅模式。这2个方法就是为了设置发布和订阅所在的线程。就是我们的请求和数据返回处理的线程。subscribeOn表示我们的请求最终走在那个线程。observeOn表示最终数据请求后在那个线程处理。这里是我的理解大家可以直接参考大大的解释:subscribeOn(): 指定 subscribe() 所发生的线程,即 Observable.OnSubscribe 被激活时所处的线程。或者叫做事件产生的线程。 * observeOn(): 指定 Subscriber 所运行在的线程。或者叫做事件消费的线程。
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
这2个可以很方便我们切换线程而不用像之前那样数据请求放到后台线程然后数据处理要进行回调在主线程处理。这里我们要注意的就是这个observeOn。
subscribe
最后一步进行subscribe。这里Observer的类型取决于你上面的最近observable是什么类型。然后根据返回结果进行相应的处理。
总结
简单的使用就是上面所讲的。然后他的优势也看出来了,链式的请求操作。就是一步一步,1做完开始做2,2做完接着做3…比如上面的例子。先要将文件夹集合拆开成文件夹,然后再遍历单独文件夹,获取一个file的observable,然后再对这个文件进行过滤获取.png文件,然后将其转换成bitmap,最后将bitmap设置到imageCollectorView 上。这是一个流水线的操作。
之前我在项目中遇到一个请求,一个界面需要调用3个接口,接口2的参数来源于接口1。然后请求完所有数据后显示界面。项目中用的是volley。先请求一遍接口拿到参数,然后去请求接口2,最后接口3.看起开是没什么,但是既要写请求回调,还要嵌套请求。想比较来说用Rx的话会整个清楚一些。
以上,不对的地方请指出谢谢~