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的Alomst 10秒。
这是因为根据处理程序的DOC,该任务在处理程序创建的任何线程上运行。在这种情况下,这是您的UI线程。
创建一个新处理程序时,它绑定到创建它的线程的线程/消息队列
您需要使用"处理程序"分配处理程序的处理程序,以进行操作。
初始化处理程序时,请这样做:
HandlerThread thread = new HandlerThread("newthread");
thread.start();
Handler handler = new Handler(thread.getLooper());
另外,请检查此链接以获取有关使用HandlerThread的更多信息和最佳实践。