我在我创建的新线程中运行以下代码:
new Thread(new Runnable() {
public void run() {
// CODE BELOW
}
}).start();
所以我的runonUI代码永远不会被执行。我的印象是我需要在UI线程上运行它才能更新适配器。我也正确更新适配器吗?
Log.d(App.app.chats.toString(),"THIS IS THE TEXTS WE SHOULD DISPLAY");
((ArrayAdapter)App.app.chatDisplay.getAdapter()).clear();
for (int i = 0; i < App.app.chats.size(); i++) {
((ArrayAdapter)App.app.chatDisplay.getAdapter()).add(App.app.chats.get(i));
}
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("THIS IS ACTUALLY RUNNING","TEST");
((BaseAdapter)App.app.chatDisplay.getAdapter()).notifyDataSetChanged();
}
});
答案 0 :(得分:0)
如果我正确理解您的问题,则无法从后台线程修改ArrayAdapter
。 clear
和add
方法调用都在内部调用notifyDataSetChanged
。这意味着您的notifyDataSetChanged
调用是多余的,并且在您到达runOnUiThread
行之前该线程正在崩溃。
快速解决方法是在改变适配器之前添加以下内容。
((ArrayAdapter)App.app.chatDisplay.getAdapter()).setNotifyOnChange(false);
这将禁用内部notifyDataSetChanged
调用。一旦您自己手动调用该标志,该标志将重置。另请注意,ArrayAdapter
从未打算从这样的后台线程变异。虽然上面的解决方案应该让它适合你,但我强烈建议将这些mutate方法调用移动到UI线程。