Rx系列学习笔记_Rxjava的基本了解
来源:互联网 发布:一览 mac 编辑:程序博客网 时间:2024/06/06 08:53
学习的博文:
扔物线-给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的话会整个清楚一些。
以上,不对的地方请指出谢谢~
- Rx系列学习笔记_Rxjava的基本了解
- Rx系列学习笔记_RxJava+Retrofit进行简单请求
- Rx系列学习
- Rx学习笔记
- rx+retrofit 学习笔记
- Rx学习笔记和总结
- Rx学习笔记和总结
- Rx系列学习笔记_使用okhttp拦截器统一处理返回请求
- Android学习笔记1之了解Android的基本组成
- RX学习笔记之map变换
- Rx系列学习之旅(三)--Base基类的实现
- ThreeJS学习笔记(1)-基本了解
- Opencv2系列学习笔记1(图像的基本操作)
- Opencv2系列学习笔记1(图像的基本操作)
- Rx系列学习之旅(一)--MVP架构篇
- Rx系列学习之旅(二)--MVP+Dagger2
- 了解学习Linux的基本命令
- grails学习笔记-4、通过例子了解grails开发的基本流程
- aaa
- java基础知识点总结
- JS实现div随着鼠标移动
- VirtualBox中VboxGuestAddition的安装方法
- linux 创建内核线程
- Rx系列学习笔记_Rxjava的基本了解
- 排序算法——选择排序
- Qt学习01——字符串类
- 如何学习新技术
- Java线程 CompletionService
- java求质数,例子1-100
- ORACLE 查询高水位表 脚本
- ADO.NET学习之SqlDataAdapter,DataSet
- 特殊字符,# + %在url中传递,encode方式加密处理