0

需要明确的是,这个问题不是关于如何从线程更新 TextView,它工作正常。问题是,即使我在整个线程中多次调用更新 TextView,更新也只会在线程完成后才会出现。这是一个例子:

公共类 NDThread 扩展线程 {

    受保护的 LogActionListener log_listener;
    私人处理程序处理程序=新处理程序();


    公共无效运行(){
        logAction("开始");
        // 做很多事情..
        logAction("中途");
        // 还有很多东西..
        日志操作(“完成”);
    }

    公共接口 LogActionListener {
        公共无效onLogAction(字符串参数字符串);
    }

    公共无效 logAction(最终字符串 str){
        if(log_listener != null) handler.post(new Runnable() {
            @覆盖
            公共无效运行(){
                log_listener.onLogAction(str);          
            }       
        });
    }
}

在我的主要活动中,我实现LogActionListener接收字符串并更新 TextView:

NDThread 线程 = 新的 NDThread();
thread.setOnLogActionListener(this);
线程.run();

// 其他地方..
@覆盖
公共无效onLogAction(最终字符串味精){
        handler.post(new Runnable() {

            @覆盖
            公共无效运行(){
                textView.append(msg);
            }

        });
}

如您所见,我Handler在 Thread 和 Activity 中都使用了 s,因为我不确定哪个正确使用。但是,结果始终是整个 Thread 的空白 TextView,然后在最后它将打印 3 行。我究竟做错了什么?

4

4 回答 4

2

避免线程并使用AsyncTask

您正在寻找的是onProgressUpdate(Progress...) , publishProgress(Progress...)的 AsyncTask

谷歌他们的代码示例。

于 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() 方法只在当前线程中执行,而不启动新线程。”

同样正如其他人已经提到的那样,您不需要两个处理程序。做就是了:

    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 回答