/* Rxjava的异步执行 schedulers 使用
被观察者调用subscribe()订阅观察者事件监听的时候 就产生了事件(事件产生源) 默认情况下
事件在哪个线程产生 事件就在相应的线程消费 (同步概念)
如果要指定的代码执行在不同的线程 就需要Scheduler 提供了很多静态方法。
1 Schedulers.xxx 调用不同的静态方法 产生不同的线程
2 特殊的 AndroidScheduler.mainThread() 运行主线程
线程事件设置用被观察者的 SubscribOn() observeOn()方法
SubscribOn() 参数指定线程(例如1中调用) 指定事件产生所在线程
observeOn 指定事件消费所在的线程
*/
// 简单的使用Demo
Observable.just(1,2,3,4)
.subscribeOn(Schedulers.io())//指定subscribe() 发生的线程
.observeOn(AndroidSchedulers.mainThread())// 指定回调(Subcriber)发生的线程
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.i(TAG, "call:事件的调度 "+integer);
}
});
// 如上 1234 的发出 在子线程中执行 而打印的回调发生在主线程
// 完整写法
Subscriber<Integer> subscriber1 = new Subscriber<Integer>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Integer integer) {
Log.i(TAG, "onNext: "+integer);
}
};
Observable observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onNext(4);
}
});
observable1.subscribeOn(Schedulers.io())//指定subscribe() 发生的线程
.observeOn(AndroidSchedulers.mainThread())// 指定回调(Subcriber)发生的线程
.subscribe(subscriber1);

image.png
//修改上面加载图片的例子 让在主线程设置图片 子线程获取图片
final int rec = R.mipmap.ic_launcher;
final ImageView img = new ImageView(this);
Observable.create(new Observable.OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getResources().getDrawable(rec);
subscriber.onNext(drawable);
}
}).subscribeOn(Schedulers.io())//指定subscribe() 发生的线程
.observeOn(AndroidSchedulers.mainThread())// 指定回调(Subcriber)发生的线程
.subscribe(new Observer<Drawable>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable throwable) {
}
@Override
public void onNext(Drawable drawable) {
img.setImageDrawable(drawable);
}
});
// 订阅事件 也就是Observable 发生在子线程 回调消费事件 也就观察者监听回调 发生在主线程
网友评论