RxJava2线程调度
线程调度
Observable.create(e -> {
showLog("" + Thread.currentThread().getName());
showLog("emit1");
e.onNext(1);
}).subscribe(integer -> {
showLog("" + Thread.currentThread().getName());
showLog("" + integer);
});
打印Log:
01-15 13:43:10.657 1796-1796/? E/ccer: main
01-15 13:43:10.657 1796-1796/? E/ccer: main
01-15 13:43:10.657 1796-1796/? E/ccer: emit1
01-15 13:43:10.657 1796-1796/? E/ccer: main
01-15 13:43:10.657 1796-1796/? E/ccer: 1
都在一个线程中,那就是UI主线程
Observable.create(e -> {
showLog("" + Thread.currentThread().getName());
showLog("emit1");
e.onNext(1);
}).subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(integer -> {
showLog("" + Thread.currentThread().getName());
showLog("" + integer);
});
打印Log:
01-15 13:51:22.005 1966-1966/? E/ccer: main
01-15 13:51:22.009 1966-1980/? E/ccer: RxNewThreadScheduler-1
01-15 13:51:22.009 1966-1980/? E/ccer: emit1
01-15 13:51:22.085 1966-1966/? E/ccer: main
01-15 13:51:22.085 1966-1966/? E/ccer: 1
可以看出,上游在子线程做耗时发送事件,下游在主线程做UI更新
多次指定上游只有第一次有效,多次指定下游,则不停的切换
在RxJava中, 已经内置了很多线程选项供我们选择, 例如有
Schedulers.io() 代表io操作的线程, 通常用于网络,读写文件等io密集型的操作
Schedulers.computation() 代表CPU计算密集型的操作, 例如需要大量计算的操作
Schedulers.newThread() 代表一个常规的新线程
AndroidSchedulers.mainThread() 代表Android的主线程
这几个的耗时操作我们可以用在网络请求上、读写数据库上。
多个开关
如果有多个Disposable 该怎么办呢, RxJava中已经内置了一个容器CompositeDisposable, 每当我们得到一个Disposable时就调用CompositeDisposable.add()将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear() 即可切断所有的水管。