我知道在正常情况下,不能在后台线程中调用 ListAdapter.notifyDataSetChanged() 来更新列表视图。所以我试着像这样解决:
class mythread extends thread {
private ListAdapter listAdapter;
...
public void run() {
listAdpater.setNotifyOnChange(false);
listAdapter.addAll(A_LARGE_ARRAY);
}
...
}
当线程完成时,它会向 UI 线程中运行的处理程序发送一条消息,该处理程序将调用 listAdapter.notifyDataSetChanged() 来更新列表视图。
它似乎工作,除了当我尝试调试它时,调试器抱怨“适配器已更改,而列表视图没有收到通知。确保只在 UI 线程中修改 adpater。”
即使我调用了 setNotifyOnChange(false),android 框架是否会监视适配器的修改?有什么办法可以解决吗?
PS。在我自己的基准测试中,通过将 listAdapter.addAll(A_LARGE_ARRAY) 移动到后台线程,它为我节省了大约 126 毫秒的执行时间,这意味着,如果我在 UI 线程中修改适配器,它将被阻塞 126 毫秒。
更新
遇到此问题的任何人,请参阅此Google I/O Lecture链接。这真的很有帮助。