RxJava学习笔记
RxJava三要素:
1.Observable被观察者,观察的对象,由它发出一系列的事件。可以通过create()方法创建,另外just()和from()方法同样可以实现。
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("World");
}
});
String[] name = {"Hello","World"};
Observable<String> observable1 = Observable.from(name);
Observable<String> observable2 = Observable.just("Hello","World");
2.Observer观察者,从被观察者Observable得到事件并决定产生怎样的行为。除了 Observer 接口之外,RxJava 还内置了一个实现了 Observer 的抽象类:
Subscriber。他们的基本使用方式是完全一样的,Observer 在 subscribe() 过程中最终也会被转换成 Subscriber 对象。
Subscriber<Drawable> subscriber = new Subscriber<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
};
3.Subscribe 订阅,Observable的事件发送是在被订阅的时候才开始执行,subscribe()方法执行时。
observable.subscribe(subscriber);
示例:
//将得到的drawable图像显示到ImageView
Observable<Drawable> observable = Observable.just(drawable);
Subscriber<Drawable> subscriber = new Subscriber<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
};
observable.subscribe(subscriber);
RxJava变换
RxJava可以对事件序列中的对象或整个序列进行变换,转化为所需要的对象类型。
1.Map(),对事件对象的直接变换
//int类型的drawableRes通过map转变为drawable类型
Observable.just(drawableRes)
.map(new Func1<Integer, Drawable>() {
@Override
public Drawable call(Integer integer) {
return mContext.getDrawable(integer);
}
})
.subscribe(new Action1<Drawable>() {
@Override
public void call(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
});
PS:FuncX也有多个,是带参数有返回值的,ActionX是带参数无返回值的。
2.flatMap()
flatMap()将传进来的对象,返回一个生成的Observable对象,这个Observable再接收传进来的事件发送给Subscribe的回掉call方法,实现了
两次的变换。
Student[] students = initView();
Observable.from(students)
.flatMap(new Func1<Student, Observable<Course>>() {
@Override
public Observable<Course> call(Student student) {
return Observable.from(student.getCourses());
}
})
.subscribe(new Action1<Course>() {
@Override
public void call(Course course) {
Log.i("course",course.getCourse());
}
});
3.compose:对Observable的整体的变换
lift()的变换是针对Observable中的事件序列的,compose()是对Obsrvable的整体进行的变换。
/**
*实现Transformer接口,Obervable通过Transformer传递进来的对象进行多次变换,实现自身的变换。
*/
public class TestCompose implements Observable.Transformer<String,Bitmap> {
@Override
public Observable<Bitmap> call(Observable<String> stringObservable) {
return stringObservable.map(new Func1<String, InputStream>() {
@Override
public InputStream call(String s) {
return HTTPRequest.Request(s);
}
}).map(new Func1<InputStream, Bitmap>() {
@Override
public Bitmap call(InputStream inputStream) {
return BitmapFactory.decodeStream(inputStream);
}
});
}
}
Observable.Transformer lift = new TestCompose();
Observable.just(url)
.observeOn(Schedulers.newThread())
.compose(lift)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageee.setImageBitmap(bitmap);
}
});
RxJava线程控制:Scheduler
线程控制器,可以指定每一部分代码运行的线程
- subscribeOn():指定subscribe() 所发生的线程,主要改变的是订阅的线程,即call()执行的线程,
当有多个subscribeOn()同时存在时,只有第一个会产生作用。
- observeOn():指定Subscriber所运行在的线程,即onNext()执行的线程。
可以通过observeOn()的多处设定不断改变运行的线程。
常用线程:
- Schedulers.newThread():启用新的线程,并在新线程执行操作。
- Schedulers.io():执行I/O操作所使用的线程。
- AndroidSchedulers.mainThread():在Android的主线程执行操作。
Observable.just(url)
//发起线程在新的线程
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
return getBitMap(s);//新线程中执行
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
//主线程中执行
Imageget.setImageBitmap(bitmap);
}
});
本文错误之处,感谢指出!
本文参考:给 Android 开发者的 RxJava 详解(部分内容引用自该博客)