明確にするために、この質問はThread から TextView を更新する方法に関するものではなく、正常に機能しています。問題は、スレッド全体で TextView を更新するために複数の呼び出しを行っても、スレッドが完了した後にのみ更新が表示されることです。次に例を示します。
public class NDThread extends Thread {
保護された LogActionListener log_listener;
プライベート ハンドラー ハンドラー = 新しい Handler();
public void run() {
logAction("開始");
// 多くのことを行う..
logAction("途中");
// 他にもいろいろ..
logAction("完了");
}
パブリック インターフェイス LogActionListener {
public void onLogAction(String paramString);
}
public void logAction(最終文字列 str) {
if(log_listener != null) handler.post(new Runnable() {
@オーバーライド
public void run() {
log_listener.onLogAction(文字列);
}
});
}
}
メインのアクティビティではLogActionListener、文字列を受け取り、TextView を更新するように実装します。
NDThread スレッド = 新しい NDThread();
thread.setOnLogActionListener(これ);
スレッド.run();
// 他の場所..
@オーバーライド
public void onLogAction(最終文字列メッセージ) {
handler.post(新しい Runnable() {
@オーバーライド
public void run() {
textView.append(msg);
}
});
}
ご覧のとおりHandler、スレッドとアクティビティの両方で s を使用しました。どちらを使用するのが正しいかよくわからなかったからです。ただし、結果は常にスレッド全体の空の TextView になり、最後に 3 行が出力されます。私は何を間違っていますか?