在recyclerview中更新10到15个项目时,Diffutils阻止UI

时间:2019-07-01 14:36:35

标签: android android-recyclerview recycler-adapter android-diffutils

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秒钟。

1 个答案:

答案 0 :(得分:0)

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

  

创建新的处理程序时,它绑定到正在创建它的线程的线程/消息队列中

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

在初始化处理程序时执行此操作:

           0         1
0   0.131415 -0.226093
1  -0.509641 -0.226093
2   0.507909 -0.226093
3  -0.743677 -1.554392
4   1.271071  1.102205
5  -0.019945  1.102205

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