RxJava比较流弊除了线程调度之外,还比较流弊的的方面就是变换
变换:就是将事件中序列中的对象或者整个序列进行加工处理,转换成不同的事件或者事件序列.
看似复杂,简单说就是加工(如一个图片的路径加工得到一张图片)
例子:
/** * 参数类型是drawable id 最终获得drawable图片 */ private void mapTest() { Observable.just(R.drawable.ic_launcher).map(new Func1<Integer, Drawable>() { @Override public Drawable call(Integer integer) { return getResources().getDrawable(integer); } }).subscribe(new Action1<Drawable>() { @Override public void call(Drawable drawable) { imageView.setImageDrawable(drawable); } }); /** * 这里出现了一个叫做Func1的类,它和Action1非常相似,也是RxJava的一个接口,用于包装含有 * 一个参数的方法,Func1与Action1的区别在于,Func1包装的是有返回值的方法,另外和Action一样,FuncX也有多个 * 用于不同参数的个数的方法, * FuncX与ActionX的区别在于是否含有返回值 */ }
flatMap():他可以把传入的参数转换之后返回另外一个对象.
例子:
/** * 打印出每个学生所需要修的所有课程 */ private void flatMap() { Student[] stus = {new Student(1, 10001), new Student(2, 10002), new Student(3, 10003)}; Observable.from(stus).flatMap(new Func1<Student, Observable<Course>>() { @Override public Observable<Course> call(Student student) { return Observable.from(student.getCourses()); } }).subscribe(new Subscriber<Course>() { @Override public void onCompleted() { LogUtils.d("----->onCompleted:"); } @Override public void onError(Throwable e) { LogUtils.d("----->onError:" + e); } @Override public void onNext(Course course) { Toast.makeText(SixActivity.this, course.name, Toast.LENGTH_SHORT).show(); LogUtils.d("----->onNext:" + course.name); } }); }
以上我们可以看出,flatMap()和map()有一个相同点:它就是把传入的参数转换之后返回另外一个对象,但是需要注意,map和flatMap不同的,flatMap()中返回的是个Observable对象,并且这个Obserable对象并不是直接发送到了Subscriber的回调方法中
flatMap()的原理是这样的:1:使用传入的事件对象创建一个Observable对象;
2:并不发送这个Observable,而不是将他激活,于是他开始发送事件,
3:每一个创建出来的Obsevable发送的事件,都被汇入了同一个Observable,而这个Observable负责将这些事件同意交给Subsciber的回调方法,这三个步骤,把事件拆分成了两级,通过一组新创建的Observable将初始的对象[铺平]之后通过统一的路径分发下去,而这个[铺平]就是flatmap()所谓udefl;at