Как выполнить длительную операцию Databse с использованием RxJava2, пока все задачи не будут выполнены и данные не будут вставлены в базу данных в Android? - PullRequest
0 голосов
/ 24 июня 2019

Я новичок в RxJava. В настоящее время я выполнил три параллельных вызова API, которые не зависят друг от друга с помощью Retrofit с использованием оператора Single.Zip. Получив успешный ответ на все три вызова API, я должен вставить данные всех трех API в базу данных Room в различные объекты, что занимает 20 секунд.

Так что мне нужно выполнить операции с базой данных внутри оператора Single.Zip. Потому что логика написана внутри метода onSuccess, запущенного до выполнения операции базы данных.

Я пытался использовать отдельный Observer для выполнения операций с базой данных, но не работал.

public void callOfflineDataAPIs() {
        setIsLoading(true);
        Single<BaseResponse<ProductResponse>> single1 = getDataManager().getOfflineProductListApiCall(getDataManager().getLastTimeStampOfflineProductCall()).subscribeOn(getSchedulerProvider().io()).observeOn(getSchedulerProvider().ui());
        Single<BaseResponse<LocationResponse>> single2 = getDataManager().getOfflineLocationListApiCall(getDataManager().getLastTimeStampOfflineLocationCall()).subscribeOn(getSchedulerProvider().io()).observeOn(getSchedulerProvider().ui());
        Single<BaseResponse<OfflineMasterData>> single3 = getDataManager().getOfflineMasterDataListApiCall(getDataManager().getLastTimeStampOfflineMasterCall()).subscribeOn(getSchedulerProvider().io()).observeOn(getSchedulerProvider().ui());

        DisposableSingleObserver<List<Boolean>> result = Single.zip(single3, single1, single2,
                (offlineMasterDataBaseResponse, productResponseBaseResponse, locationResponseBaseResponse) -> {
                    List<Boolean> apiCalls = new ArrayList<>();

                    apiCalls.add(masterDataCRUDOperation(offlineMasterDataBaseResponse));
                    apiCalls.add(productDataCRUDOperation(productResponseBaseResponse));
                    apiCalls.add(locationDataCRUDOperation(locationResponseBaseResponse));
                    return apiCalls;
                }).subscribeOn(getSchedulerProvider().io()).observeOn(getSchedulerProvider().ui()).subscribeWith(new DisposableSingleObserver<List<Boolean>>() {
            @Override
            public void onSuccess(List<Boolean> apiCalls) {
                setIsLoading(false);
                LogHelper.e(TAG, "DisposableSingleObserver- onSuccess");
                boolean isSync = true;
                for (int i = 0; i < apiCalls.size(); i++) {
                    if (!apiCalls.get(i)) {
                        isSync = false;
                        LogHelper.e(TAG, "DisposableSingleObserver- onSuccess- apiCalls.get(i)", i);
                        callOfflineDataAPIs();
                        break;
                    }
                }

                if (isSync) {
                    LogHelper.e(TAG, "IF-isSync");
                    if (BuildConfig.IS_CLIENT_BUILD) {
                        LogHelper.e(TAG, "IF-isSync-IS_CLIENT_BUILD-true");
                        getDataManager().setCurrentWarehouseKey(1);
                        getNavigator().onGoButtonClick();
                    } else {
                        LogHelper.e(TAG, "ELSE-isSync-IS_CLIENT_BUILD-false");
                        getWarehouseList();
                    }
                }
            }

            @Override
            public void onError(Throwable e) {
                LogHelper.e(TAG, "DisposableSingleObserver- Throwable");
                setIsLoading(false);
                String errorMessage = new NetworkError(e).getAppErrorMessage();
                getNavigator().exitApplicationOnError(errorMessage);
            }
        });
}

Логика, записанная в методе onSuccess, выполняется после выполнения всех операций с БД.

1 Ответ

0 голосов
/ 26 июня 2019

Вы можете изменить свой код на что-то вроде:

        DisposableSingleObserver<List<Boolean>> result = Single.zip(single3, single1, single2,
                (offlineMasterDataBaseResponse, productResponseBaseResponse, locationResponseBaseResponse) -> {
                    List<Boolean> apiCalls = new ArrayList<>();

                    apiCalls.add(masterDataCRUDOperation(offlineMasterDataBaseResponse));
                    apiCalls.add(productDataCRUDOperation(productResponseBaseResponse));
                    apiCalls.add(locationDataCRUDOperation(locationResponseBaseResponse));
                    return apiCalls;
                }).subscribeOn(getSchedulerProvider().io())
                  .map(new Function<List<Boolean> apiCalls, List<Boolean> apiCalls>() {
                        @Override
                        public List<Boolean> apiCalls apply(List<Boolean> apiCalls) throws Exception {
                            // perform database operations here
                            return apiCalls;
                        }
                    })
                    .observeOn(getSchedulerProvider().ui())
                    .subscribe(new Observer<List<Boolean>>() {

                        @Override
                        public void onNext(User user) {
                           // Do something
                        }

                        @Override
                        public void onError(Throwable e) {
                             // Do something
                        }

                        @Override
                        public void onComplete() {
                             // Do something
                        }
                    });
...