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 に答える