ArrayAdapter notifyDataSetChanged未在UI线程上执行

时间:2014-12-13 02:45:41

标签: android android-arrayadapter notifydatasetchanged android-runonuithread

我在我创建的新线程中运行以下代码:

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

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,则无法从后台线程修改ArrayAdapterclearadd方法调用都在内部调用notifyDataSetChanged。这意味着您的notifyDataSetChanged调用是多余的,并且在您到达runOnUiThread行之前该线程正在崩溃。

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

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

这将禁用内部notifyDataSetChanged调用。一旦您自己手动调用该标志,该标志将重置。另请注意,ArrayAdapter从未打算从这样的后台线程变异。虽然上面的解决方案应该让它适合你,但我强烈建议将这些mutate方法调用移动到UI线程。