v3.5.0 版本为了优化商品列表加载性能,把网络请求放到子线程异步执行,但引入了三个致命问题:
- 没有取消前一个请求:用户快速点击刷新,多个异步请求并发进行。
- 直接清空并更新数据:新请求返回后
productList.clear(); productList.addAll(newProducts); adapter.notifyDataSetChanged();,粗暴地重置列表。 - UI 状态不一致:RecyclerView 正在渲染 position=5 的位置,但新的数据只有 5 条,
products.get(5)直接抛IndexOutOfBoundsException。
本质上这是一次「异步加载 + 数据竞态」的经典事故:性能优化引入了并发写入 UI 数据源的时序问题。修复思路通常包括:取消或忽略上一个请求(例如利用 rxJava 的 switchMap 或 Kotlin 协程的 collectLatest);使用 DiffUtil 进行局部更新而不是清空 + notify;在 onBindViewHolder 中做防御式判断。




