这是我第一次使用RxJava(以及Android Room,尽管与问题不相关)。我在应用程序中嵌套了RecyclerViews
,其中第一个RV显示当天,第二个RV显示当天的预测。该应用程序允许用户更改其邮政编码。更改邮政编码后,应更新2个RV中的数据。因此,发出了一个新的网络请求,并且两个RV应该更新其数据。
再次,这是我第一次使用RxJava。因此,我真的不知道哪种最佳的观察者/可观察的组合最适合我的特定情况。我认为Flowable效果最好,因为每次数据更改时它都会发出数据,而最终用户更改其邮政编码时,正是这种情况:发出新的网络请求并更新Room DB。
但是,自从我将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
进行订阅,但是我不完全了解这样做的作用以及如何解决我的问题。不过,更大的问题是我不确定如何解决该问题。非常感谢任何可以提供帮助的人。您的下一个美味,冷(虚拟)饮料将在我身上。