gpt4 book ai didi

android - RecyclerView 和 DiffUtil - 并发噩梦

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:48 26 4
gpt4 key购买 nike

The documentation for DiffUtil 建议生成 DiffUtil.DiffResult由于潜在的长计算时间,在后台线程上。这对我来说似乎是个坏主意,因为该线程可能在以下情况下对陈旧数据进行操作(假设 list 访问是线程安全的):

  1. 将数据添加到 list并通知适配器
  2. 需要更换listnewList这将有一些添加和一些删除的差异
  3. 调用DiffUtil.calculateDiff在后台获取 DiffResult对于 listnewList , 并向将使用 newList 的主线程发布消息并调用DiffResult.dispatchUpdatesTo
  4. 在处理该消息之前,用户在主线程上执行了一项操作,该操作导致 list 发生突变。
  5. 消息已处理,newList设置为新的数据源并且 DiffResult.dispatchUpdatesTo运行导致底层数据 View 不一致+自DiffResults以来的任何突变丢失被计算

那不行,让我们从第 3 步开始更改:

  1. 设置newList作为新的数据源,请调用 DiffUtil.calculateDiff在后台获取 DiffResult对于 listnewList , 并向将调用 DiffResult.dispatchUpdatesTo 的主线程发布消息
  2. 在处理该消息之前,用户在主线程上执行了一项操作,该操作导致 newList 发生突变。 ,并通知适配器,导致数据 View 不一致,因为 DiffResult.dispatchUpdatesTo还没有被调用

还有更多变体,但都不好。这似乎是可靠使用 DiffUtil 的唯一方法使用大型数据集和变更集是禁用或排队所有更新,直到 DiffResult.dispatchUpdatesTo被称为。

我是否遗漏了一些会使上述错误的东西?

最佳答案

我最终在 DiffUtil 计算期间堆叠更新以管理用户交互,并且仍然仅在主线程中访问数据集。

我写在那里:https://geoffreymetais.github.io/code/diffutil-threading/

关于android - RecyclerView 和 DiffUtil - 并发噩梦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40291249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com