Это первый раз, когда я использую 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
для своей подписки, но я не совсем понимаю, что это делает, и как это может решить мою проблему.Однако большая проблема заключается в том, что я не уверен, как решить проблему с рывками и заиканиями.Большое спасибо всем, кто может оказать помощь в этом.Ваш следующий вкусный, холодный (виртуальный) напиток будет на мне.