Цикл во время использования RxJava с комнатой - PullRequest
0 голосов
/ 30 апреля 2018

Я пытался использовать RxJava с комнатой. Логика проста: если для текущей даты нет строки, я создам экземпляр и вставлю строку в базу данных. Проблема в том, что строка вставляется, но она действует как цикл. Когда я отлаживаю, код переходит к запуску insertTestType, завершается, а затем переходит к части подписчика getTestModel, затем счетчик равен 1, а затем останавливается.

private void getTestModel() {
        String date = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());
        mCompositeDisposable.add(questionDatabase.questionDao().getTestByDate(date, testType)
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(testModels -> {
                    if (testModels.size() > 0) {
                        testModel = testModels.get(0);
                    } else {
                        testModel = new TestModel(testType, date);
                        insertTestType();
                    }
                }, throwable -> Log.e("ErrorRx", "exception getModels")));
    }

    private void insertTestType() {
        Completable.fromAction(() -> questionDatabase.questionDao().insert(testModel))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new DisposableCompletableObserver() {
                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }
                });
    }

База данных,

@Insert
void insert(TestModel testModel);

@Query("SELECT * FROM " + TestModel.TABLE_NAME+ " WHERE " + TestModel.DATE + " = :date" + " AND testType " + "=:testType")
Flowable<List<TestModel>> getTestByDate(String date, TestType testType);

почему он возвращается к предыдущему подписчику? Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2018

Код работает так, как и должно быть:)
Когда вы используете Flowable, каждый раз, когда данные обновляются, объект Flowable будет излучать автоматически, уведомляя всех своих подписчиков, и поэтому он вызывает код из subscribe в вашем первом методе.
Если вы не хотите такого поведения, рассмотрите возможность использования Maybe - больше информации здесь

...