2017-07-17 2 views
0

非常に遅いデバイスでアプリの動作をエミュレートする必要があります。だから私はSchedulers.io()優先度の低い1つだけのスレッドを使用するをオーバーライドします。可能であれば、タスクをキューに入れる前にいくつかの遅延を追加する。コードでSchedules.io()を変更せずに、一度グローバルに行う方法はありますか?Schedulers.io()をオーバーライドする方法は?

答えて

1

あなたは別との結果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); 
関連する問題