android - 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
用于订阅,但我不完全理解它的作用以及它如何解决我的问题。但更大的问题是我不确定如何解决卡顿/口吃问题。非常感谢任何可以提供帮助的人。你的下一个美味的冷(虚拟)饮料将在我身上。
解决方案
推荐阅读
- sql - 传递引用值sql加参数
- c# - ServiceStack FallbackRoute 因升级的 ServiceStack 版本而失败
- jquery - 如何通过jquery远程获取具有相同类名的每个元素
- ios - 如何使用 Runner.app 创建用于测试的 .ipa 文件?
- ios - Swizzling UIResponder Touch 事件不调用原始方法实现
- php - 使用 Nginx 的 PHP - 403 禁止
- excel - 我需要连接值并用“|”分隔 但忽略空格
- facebook - 使用 Facebook Graph 获取封面照片的 URL
- c# - 在没有新窗口的现有控制台/cmd.exe 中生成子控制台/cmd.exe
- javascript - 数组或循环结果