0

我正在通过执行以下操作创建的新线程中运行以下代码:

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();
    }
});
4

1 回答 1

0

如果我正确理解您的问题,您不能ArrayAdapter从后台线程修改。clear和方法调用都在add内部调用notifyDataSetChanged。这意味着您的notifyDataSetChanged调用有点多余,并且该线程甚至在您到达您的runOnUiThread线路之前就崩溃了。

一个快速的解决方法是在改变适配器之前添加以下内容。

((ArrayAdapter)App.app.chatDisplay.getAdapter()).setNotifyOnChange(false);

这将禁用内部notifyDataSetChanged调用。一旦您自己手动调用它,该标志就会重置。另请注意,ArrayAdapter从未打算从这样的后台线程中进行变异。虽然上述解决方案应该可以为您工作,但我强烈建议将这些 mutate 方法调用移至 UI 线程。

于 2014-12-13T11:59:24.440 回答