1
final Handler handler = new Handler();
    new Thread(new Runnable() {
      @Override
      public void run() {
        final DiffUtil.DiffResult diffResult =
          DiffUtil.calculateDiff(new DiffCb(oldItems, newItems));
        handler.post(new Runnable() {
          @Override
          public void run() {
            applyDiffResult(newItems, diffResult);
          }
        });
      }
    }).start();
  }

这就是我进行计算和更新列表的方式。但是当我更新 2,3 个项目时,它完美无缺。但是当我更新像 20 这样的项目时,它会阻塞 UI 大约 10 秒。

4

1 回答 1

0

这是因为根据 Handler 的文档,任务在创建 Handler 的任何线程上运行。在这种情况下,它是您的 UI 线程。

当您创建一个新的 Handler 时,它会绑定到创建它的线程的线程/消息队列

您需要使用 HandlerThread 在其中为 Handler 分配它自己的工作线程以进行操作。

在初始化 Handler 时执行此操作:

HandlerThread thread = new HandlerThread("newthread");
thread.start();
Handler handler = new Handler(thread.getLooper());

此外,请查看此链接以获取有关使用 HandlerThread 的更多信息和最佳实践。

于 2019-07-01T14:54:41.687 回答