初学者在使用RxJava
的过程中,经常搞不清Observable的事件序列和每次操作应该怎样切换线程,切换哪个线程
首先需要搞懂在RxJava
中.subscribeOn()
和 observeOn()
之间的区别:
- .subscribeOn()
用来指定Observable
应该操作的调度器(Scheduler
)
- .observeOn()
指定 Observable
在一个指定的调度器(Scheduler
)上给观察者发送通知
- 默认情况下, 事件序列操作的线程与调用.subscribe()
的线程一致
没理解?
英文原文: https://medium.com/@diolor/observe-in-the-correct-thread-1939bb9bb9d2#.nn1m7lrb8
翻译: hanks
注: 不是完全翻译,添加了具体例子
例子
1.主线程 / .subscribe() 线程
在 Activity的 onCreate()
(主线程) 方法中添加以下代码:
Observable.just(1,2,3)
.subscribe();
调用情况如下:
实验:
Observable.just(1,2,3)
.doOnNext(new Action1<Integer>() {
@Override public void call(Integer integer) {
Log.i("RxThread", "doOnNext:" + integer +", run In :" + Thread.currentThread().getName() );
}
})
.subscribe(new Action1<Integer>() {
@Override public void call(Integer integer) {
Log.i("RxThread", "get result:" + integer +", run In :" + Thread.currentThread().getName() );
}
});
输出结果:
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: doOnNext:1, run In :main
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: get result:1, run In :main
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: doOnNext:2, run In :main
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: get result:2, run In :main
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: doOnNext:3, run In :main
12-06 16:14:39.225 15603-15603/com.hanks.rxsearch I/RxThread: get result:3, run In :main
2. .subscribeOn()
即使你在主线程中添加下面的代码,但是整段代码将运行在 .subscribeOn()
定义的线程上
Observable.just(1,2,3)
.subscribeOn(Schedulers.newThread())
.subscribe();
实验:
Observable.just(1,2,3)
.doOnNext(new Action1<Integer>() {
@Override public void call(Integer integer) {
Log.i("RxThread", "doOnNext:" + integer +", run In :" + Thread.currentThread().getName() );
}
})
.subscribeOn(Schedulers.newThread())
.subscribe(new Action1<Integer>() {
@Override public void call(Integer integer) {
Log.i("RxThread", "get result:" + integer +", run In :" + Thread.currentThread().getName() );
}
});
输出结果:
12-06 16:13:17.717 14294-14319/com.hanks.rxsearch I/RxThread: doOnNext:1, run In :RxNewThreadScheduler-1
12-06 16:13:17.717 14294-14319/com.hanks.rxsearch I/RxThread: get result:1, run In :RxNewThreadScheduler-1
12-06 16:13:17.717 14294-14319/com.hanks.rxsearch I/RxThread: doOnNext:2, run In :RxNewThreadScheduler-1
12-06