2017-07-17 102 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);