执行异步任务列表时,如何在Runnables
下手动运行Schedulers.io
。
我们所有的Web服务调用都将在Runnable接口下委派,因此对schedule
的所有调用均来自我们的所有Web请求。
当前,我们正在尝试找到一个临时解决方案,以在所有webServices任务中使用RxAndroid。
以下面的代码段为例:
public class SchedulerIO implements Scheduler {
private io.reactivex.Scheduler ioScheduler;
private CompositeDisposable compositeDisposable;
public SchedulerIO(@Named("IOSCHEDULER") io.reactivex.Scheduler ioScheduler) {
this.ioScheduler = ioScheduler;
this.compositeDisposable = new CompositeDisposable();
this.ioScheduler.start();
}
@Override
public void schedule(Runnable runnable) {
schedule(runnable , null);
}
public void schedule(Runnable runnable , Scheduler.Callback callback){
this.compositeDisposable.add(execute(runnable , callback));
}
public Disposable execute(Runnable runnable , Scheduler.Callback callback){
return Observable.just(runnable)
.observeOn(ioScheduler)
.doOnComplete(callback::onComplete)
.subscribeOn(ioScheduler)
.subscribe();
}
@Override
public void cancel() {
if(compositeDisposable != null && !compositeDisposable.isDisposed()){
compositeDisposable.dispose();
}
}
}
仅供参考:接口Scheduler
是现有代码的一部分,我们避免了巨大的代码更改,因为ExecutorScheduler
的现有代码库具有相同的行为,但实现不同。
请参见以下代码段:
public class ExecutorScheduler implements Scheduler {
private final ExecutorService executorService;
public ExecutorScheduler(ExecutorService executorService) {
this.executorService = executorService;
}
@Override
public void schedule(Runnable runnable) {
schedule(Arrays.asList(runnable), null);
}
@Override
public void cancel() {
}
public void schedule(final List<Runnable> runnables, final Callback callback) {
CompletableFuture<?>[] futureList = StreamSupport.stream(runnables)
.map(task -> CompletableFuture.runAsync(task, executorService))
.toArray(CompletableFuture[]::new);
CompletableFuture.allOf(futureList).thenRun(() -> {
if (callback != null) callback.onComplete();
}
);
}
}
暂时,我们这样做是为了避免现有代码中的巨大代码更改。
我们要使用ExecutorService
将RxAndroid的Scheduler
替换为Schedulers.io
这是RxAndroid处理异步任务的正确实现吗?
它有什么影响,因为此新实现仅关注io,仅此而已。