0

明確にするために、この質問は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 行が出力されます。私は何を間違っていますか?

4

4 に答える 4

2

スレッドを避けてAsyncTaskに進む

探しているのは、AsyncTaskのonProgressUpdate(Progress ...)、publishProgress(Progress ...)です。

コードサンプルについてはGoogle。

于 2012-09-30T16:52:43.793 に答える
1

runOnUiThreadを使用してみて、その中のtextviewを更新してください

于 2012-09-30T16:36:27.833 に答える
0

onLogAction()の定義を次のように置き換えてみてください。

@Override
public void onLogAction(final String msg) {
  textView.append(msg);
}
于 2012-09-30T16:45:07.240 に答える
0

問題はここにあります

NDThread thread = new NDThread();
thread.setOnLogActionListener(this);
thread.run();

そのはず

NDThread thread = new NDThread();
thread.setOnLogActionListener(this);
thread.start();

「start() メソッドは、run() メソッドを実行する新しいスレッドを作成します。run() メソッドは、新しいスレッドを開始することなく、現在のスレッドで実行されるだけです。」

また、他の人がすでに述べたように、2 つのハンドラーは必要ありません。ただ行う:

    public void logAction(final String str) {
        if(log_listener != null) log_listener.onLogAction(str);          
    }

そしてメイン活動中

    @Override
    public void onLogAction(final String msg) {
       MyActivity.this.runOnUiThread( new Runnable() {
          @Override
          public void run() {
           textView.append(msg);
          }
       });
    }
于 2012-09-30T17:17:59.490 に答える