0
非常に遅いデバイスでアプリの動作をエミュレートする必要があります。だから私はSchedulers.io()優先度の低い1つだけのスレッドを使用するをオーバーライドします。可能であれば、タスクをキューに入れる前にいくつかの遅延を追加する。コードでSchedules.io()を変更せずに、一度グローバルに行う方法はありますか?Schedulers.io()をオーバーライドする方法は?
非常に遅いデバイスでアプリの動作をエミュレートする必要があります。だから私はSchedulers.io()優先度の低い1つだけのスレッドを使用するをオーバーライドします。可能であれば、タスクをキューに入れる前にいくつかの遅延を追加する。コードでSchedules.io()を変更せずに、一度グローバルに行う方法はありますか?Schedulers.io()をオーバーライドする方法は?
あなたは別との結果Scheduler
をラップその後、Schedulers.from(Executor)
を経てシングルスレッドexecutorをラップすることができます:
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);