2017-07-17 103 views
0

我需要在非常慢的设备上模拟应用程序的行为。所以我想重写Schedulers.io()只使用一个低优先级的线程。而且,如果可能的话,在将任务放入队列之前添加一些延迟。有没有任何想法如何做到全球一次,没有改变Schedules.io()调用代码?如何覆盖Schedulers.io()?

回答

1

您可以通过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);