RxJava Flowable导致不可预期的口吃/堵塞

时间:2018-10-04 14:56:20

标签: android rx-java2 android-room

这是我第一次使用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进行订阅,但是我不完全了解这样做的作用以及如何解决我的问题。不过,更大的问题是我不确定如何解决该问题。非常感谢任何可以提供帮助的人。您的下一个美味,冷(虚拟)饮料将在我身上。

0 个答案:

没有答案