Schedulers
Rxjava中的Scheduler
相当于线程控制器,Rxjava通过它来指定每一段代码应该运行在什么样的线程。Rxjava提供了5种调度器:
- .io()
- .computation()
- .immediate()
- .newThread()
- .trampoline()
另外,Android还有一个专用的AndroidSchedulers.mainThread()
指定操作将在Android主线程运行。Rxjava通过subscribeOn()
和observeOn()
两个方法来对线程进行控制,subscribeOn()
指定subscribe()
时间发生的线程,也就是事件产生的线程,observeOn()
指定Subscriber
做运行的线程,也就是消费事件的线程。
Schedulers.io()
这个调度器用于I/O操作,比如:读写文件,数据库,网络交互等等。行为模式和newThread()
差不多,重点需要注意的是线程池是无限制的,大量的I/O调度操作将创建许多个线程并占用内存。
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
System.out.println("Subscriber CurrentThread = " + Thread.currentThread().getName());
subscriber.onNext(1);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(Integer integer) {
System.out.println("Observer CurrentThread = " + Thread.currentThread().getName());
System.out.println("i = " + integer);
}
});
打印结果:</br>
I/System.out: Subscriber CurrentThread = RxIoScheduler-2</br>
I/System.out: Observer CurrentThread = main</br>
I/System.out: i = 1</br>
Schedulers.computation()
计算工作默认的调度器,这个计算指的是 CPU 密集型计算,即不会被 I/O 等操作限制性能的操作,例如图形的计算。这个 Scheduler 使用的固定的线程池,大小为 CPU 核数。
Schedulers.immediate()
这个调度器允许你立即在当前线程执行你指定的工作。这是默认的Scheduler
。
Schedulers.newThread()
这个调度器正如它所看起来的那样:它为指定任务启动一个新的线程。
Schedulers.trampoline()
当我们想在当前线程执行一个任务时,并不是立即,我们可以用trampoline()
将它入队。这个调度器将会处理它的队列并且按序运行队列中每一个任务。
网友评论