RxJava Текучий, вызывающий непредсказуемый заикание - PullRequest
0 голосов
/ 04 октября 2018

Это первый раз, когда я использую RxJava (а также Android Room, хотя и не относящийся к проблеме).Я вложил RecyclerViews в мое приложение, где первый RV показывает день, а второй RV показывает прогноз на день.Приложение позволяет пользователю изменить свой почтовый индекс.Как только почтовый индекс изменен, данные в пределах 2 RV должны быть обновлены.Поэтому делается новый сетевой запрос, и 2 RV должны обновить свои данные.

Опять же, я впервые использую RxJava.Поэтому я действительно не знаю, какая лучшая комбинация наблюдателя / наблюдаемой лучше всего подходит для моей конкретной ситуации.Я полагал, что Flowable будет работать лучше всего, потому что он будет генерировать данные каждый раз, когда данные изменяются, что и происходит, когда конечный пользователь меняет свой почтовый индекс: делается новый сетевой запрос и обновляется Room Room.

Однако, с тех пор, как я обновил свой Dao, используя Flowable вместо Single, данные обновляются в БД (я проверял с помощью Stetho), но приложение теперь имеет серьезный рывокк нему: похоже, что он постоянно пытается обновить данные, а экран постоянно обновляется.

Вот как я обновляю данные в первом RV (который содержится внутри фрагмента):

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    // A bunch of other initial setup

    Flowable<List<LocalDate>> source = MyApp.getDatabase(this.getContext()).getDao().getUniqueDays();
    source.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(uniqueDays -> {
                mAdapter.refreshData(uniqueDays);
            });

}

Я следую той же схеме для данных, которые находятся во втором RV (который вложен в первый RV, так что это вызывается в адаптере первого RV onBindViewHolder()):

    public void bind(LocalDate date, int position){

        Flowable<List<ForecastCondition>> source = MyApp.getDatabase(mContext).getDao().getForecastForDay(date);
        source.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .delaySubscription(5, TimeUnit.SECONDS)
                .subscribe(conditions -> mAdapter.refreshData(conditions));

    }

Я должен был добавить delaySubscription(5, TimeUnit.SECONDS), потому что прогнозы не всегда показывались во втором RV, но они с задержкой.

Я знаю, что я определенно делаю здесь некоторые ошибки, но я точно не знаю, что.Опять же, я никогда не работал с этим раньше, поэтому любая помощь будет принята с благодарностью.Я читал, что должен использовать Disposable для своей подписки, но я не совсем понимаю, что это делает, и как это может решить мою проблему.Однако большая проблема заключается в том, что я не уверен, как решить проблему с рывками и заиканиями.Большое спасибо всем, кто может оказать помощь в этом.Ваш следующий вкусный, холодный (виртуальный) напиток будет на мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...