如何以RxJava2方式组织异步调用链

时间:2017-02-21 08:53:22

标签: java android asynchronous rx-android rx-java2

我有下一个代码包装在AsyncTask类

        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
        @Override
        protected Void doInBackground(Void... params) {
            try {
                if (NetworkUtils.isNetworkConnected(mContext))
                    mIndicatorTable.sync().blockingGet();
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            } finally {
                try {
                    final MobileServiceList<IndicatorModel> results = mIndicatorTable.table().read(null).blockingGet();
                    if (isViewAttached()) {
                        getMvpView().refreshIndicatorList(results);
                        getMvpView().hideLoading();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        };

mIndicatorTable.sync()mIndicatorTable.table().read(null)都返回Single<Boolean>mIndicatorTable.sync() - 将本地存储与远程存储同步,如果网络不可用,那么我们只需在网络准备就绪时使用mIndicatorTable.table().read(null)从本地存储中读取 - 我们执行同步,然后从本地存储中读取(我们不会如果同步被取消或中断,请小心)。毕竟我们应该调用View来刷新RecycleView。如何使用RxJava2实现它?

#UPDATE

工作版

getDataManager().syncAll()
     .onErrorResumeNext(Single.just(false))
     .flatMap(list -> toSingle(mIndicatorTable.getTable().read(null)))
     .subscribeOn(Schedulers.newThread())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(results -> {
        if (isViewAttached()) {
            getMvpView().refreshIndicatorList(results);
            getMvpView().hideLoading();
        }
     })

1 个答案:

答案 0 :(得分:1)

rx-java只需调用.flatMap()即可轻松实现链接异步调用。

mIndicatorTable.sync()
        .flatMap(new Function<Boolean, SingleSource<MobileServiceList<IndicatorModel>>>() {
            @Override
            public SingleSource<MobileServiceList<IndicatorModel>> apply(Boolean aBoolean) throws Exception {
                return mIndicatorTable.table().read(null);
            }
        })
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(...)

但是你想在另一个线程中进行sync()调用,只能从主线程访问RecycleView。这就是rx-android派上用场的地方。 .subscribeOn(Schedulers.io())在另一个线程中实例化流,.observeOn(AndroidSchedulers.mainThread())确保在主线程中执行此行下面的语句(此处为.subscribe(...))。