RxAndroid NEWBIE-应用Schedulers.io手动运行可运行对象

时间:2018-09-11 15:42:03

标签: java android rx-android

执行异步任务列表时,如何在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,仅此而已。

0 个答案:

没有答案