您的位置:首页 > 移动开发 > Android开发

RxAndroid与RxJava 变换

2015-12-27 18:17 225 查看
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的区别在于是否含有返回值
*/
}


以上通过id获取Drawable 将这种变换队形返回的,map() 事件对象的直接变换,这是比较常见的,不过RxJava还可以针对整个事件队列.

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: