首页 > 解决方案 > RxJava Flowable 导致不可预测的卡顿/卡顿

问题描述

这是我第一次使用 RxJava(以及 Android Room,虽然与问题无关)。我已经嵌套RecyclerViews在我的应用程序中,第一个 RV 显示当天,第二个 RV 显示当天的预测。该应用程序允许用户更改他们的邮政编码。更改邮政编码后,应更新 2 个 RV 中的数据。因此,发出新的网络请求,2 个 RV 应更新其数据。

同样,这是我第一次使用 RxJava。因此,我真的不知道最佳观察者/可观察组合最适合我的特定情况。我认为 Flowable 效果最好,因为它会在每次数据更改时发出数据,这正是最终用户更改邮政编码时发生的情况:发出新的网络请求并更新 Room DB。

但是,自从我将 Dao 更新为 usingFlowable而不是 后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用于订阅,但我不完全理解它的作用以及它如何解决我的问题。但更大的问题是我不确定如何解决卡顿/口吃问题。非常感谢任何可以提供帮助的人。你的下一个美味的冷(虚拟)饮料将在我身上。

标签: androidrx-java2android-room

解决方案


推荐阅读