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秒钟。
答案 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的更多信息和最佳实践。