0
我需要在非常慢的設備上模擬應用程序的行爲。所以我想重寫Schedulers.io()只使用一個低優先級的線程。而且,如果可能的話,在將任務放入隊列之前添加一些延遲。有沒有任何想法如何做到全球一次,沒有改變Schedules.io()調用代碼?如何覆蓋Schedulers.io()?
我需要在非常慢的設備上模擬應用程序的行爲。所以我想重寫Schedulers.io()只使用一個低優先級的線程。而且,如果可能的話,在將任務放入隊列之前添加一些延遲。有沒有任何想法如何做到全球一次,沒有改變Schedules.io()調用代碼?如何覆蓋Schedulers.io()?
您可以通過Schedulers.from(Executor)
包裹單線程執行,然後包裹導致Scheduler
與另一:
ExecutorService exec = Executors.newSingleThreadExecutor();
final Scheduler sch = Schedulers.from(exec);
final long delayMillis = 1000;
Scheduler newScheduler = new Scheduler() {
@Override public Worker createWorker() {
return new NewWorker(sch.createWorker());
}
class NewWorker extends Scheduler.Worker {
final Worker actual;
NewWorker(Worker actual) {
this.actual = actual;
}
@Override public void unsubscribe() {
actual.unsubscribe();
}
@Override public boolean isUnsubscribed() {
return actual.isUnsubscribed();
}
@Override public Subscription schedule(Action0 action) {
return actual.schedule(action, delayMillis, TimeUnit.MILLISECONDS);
}
@Override public Subscription schedule(Action0 action, long delayTime,
TimeUnit unit) {
return actual.schedule(action, delayTime, unit);
}
}
};
RxJavaHooks.setOnIOScheduler(original -> newScheduler);
Observable.just(1)
.observeOn(Schedulers.io())
.toBlocking()
.subscribe(System.out::println);
不要忘了關閉的ExecutorService和復位鉤一旦你完成:
exec.shutdown();
RxJavaHooks.setOnIOScheduler(null);