Ошибка отчета Single.concat и переход к следующему - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь использовать RxJava с Android для асинхронного обновления моего представления.Когда пользователь щелкает фильм из списка в RecyclerView, я хочу сначала представить ему фильм из базы данных, если он есть.Затем я хочу получить последнюю информацию и обновить базу данных, а также пользовательский интерфейс.Я пытаюсь использовать метод concat и его вариант, но он не работает.

Я пропустил другие коды только для публикации соответствующих методов RxJava, которые извлекают данные, поскольку остальное работает нормально.

Когда я отключаю сетевое соединение с помощью приведенного ниже кода (следовательно, удаленное возвращает ошибку), приведенный ниже код вообще не отображает данные из базы данных.Только он сообщает об ошибке.Это означает, что локальный не разрешается.

    public Flowable<Movie> getMovie(final int id) {
        return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
            mLocal.save(data);
        })).onErrorResumeNext(error->{
            return Flowable.error(error);
        });
    }

И в этом коде он работает нормально, за исключением того, что теперь я не получаю сообщение об ошибке (и это правильно, так как я заменил его новым потокомиз базы данных)

    public Flowable<Movie> getMovie(final int id) {
        return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
            mLocal.save(data);
        })).onErrorResumeNext(error->{
            return mLocal.getMovie(id).toFlowable();
        });
    }

Теперь, как я могу сначала получить данные базы данных, а затем запустить сетевой вызов рядом, чтобы обновить данные и получить ошибки из базы данных или сетевого вызова?

ОБНОВЛЕНИЕ

Последний код метода

    // calling getMovie on mLocal or mRemote returns Single
    public Flowable<Movie> getMovie(final int id) {
        return Single.concat(mLocal.getMovie(id), mRemote.getMovie(id).doOnSuccess(data -> {
            mLocal.insertMovie(data);
        })).onErrorResumeNext(error -> {
            return Flowable.error(error);
        });
    }

Вот как я их называю

    public void loadMovie(int id)
    {
        Disposable d = mRepo.getMovie(id)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread(), true)
                .doOnSubscribe(subscription -> {
                    subscription.request(Long.MAX_VALUE);
                    //post progress here
                })
                .subscribe(data -> {
                            //onNext 
                        },
                        error -> { 
                           //onError
                        },
                        () -> {
                            //onComplete
                        }
                );

        mDisposables.add(d);
    }

1 Ответ

0 голосов
/ 25 июня 2018

С подтверждением того, что мой код работает, и указаниями по устранению неполадок от @ akarnokd Я обнаружил, что последний код (см. OP) работает безупречно. Результат цепочки RxJava публикуется в объекте LiveData, который должен обновить View. К сожалению, он публикует только последние данные (что является ошибкой) и пропускает первые (это данные из базы данных).

Я буду иметь дело с этим, но так как пост касается RxJava, я буду считать, что это решено!

...