代码之家  ›  专栏  ›  技术社区  ›  Erselan Khan

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

  •  1
  • Erselan Khan  · 技术社区  · 6 年前
    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的时候,它会阻塞用户界面10秒。

    0 回复  |  直到 6 年前
        1
  •  0
  •   Azhar92    6 年前

    这是因为 doc ,任务在创建处理程序的任何线程上运行。在本例中,它是您的UI线程。

    您需要使用HandlerThread,在为处理程序分配它自己的操作工作线程的地方。

    请在初始化处理程序时执行以下操作:

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

    另外,检查一下这个 link 有关使用HandlerThread的更多信息和最佳实践。