【问题标题】:Update TextView during long Thread process在长线程过程中更新 TextView
【发布时间】:2012-09-21 16:34:19
【问题描述】:

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

公共类 NDThread 扩展 Thread {

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


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

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

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

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

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

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

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

        });
}

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

【问题讨论】:

  • 在你的活动中而不是在你的线程中创建一个处理程序
  • 使用 AsyncTask 可以避免混淆 runOnUIThread 和 Handlers 或其他丑陋的代码

标签: android multithreading


【解决方案1】:

避免线程并使用 AsyncTask

你要找的是 onProgressUpdate(Progress...) , publishProgress(Progress...) 的 AsyncTask

Google 获取他们的代码示例。

【讨论】:

  • 好吧,我不确定它是如何工作的,因为我所做的只是将 Thread 更改为 ASyncTask 并将 run() 更改为 execute().. 但它成功了!
【解决方案2】:

尝试使用runOnUiThread 并更新其中的文本视图

【讨论】:

    【解决方案3】:

    尝试将 onLogAction() 的定义替换为:

    @Override
    public void onLogAction(final String msg) {
      textView.append(msg);
    }
    

    【讨论】:

    • 哦,对不起,这只是一个错字,这就是我所拥有的。
    【解决方案4】:

    问题来了

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

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 2023-04-02
      • 1970-01-01
      • 2015-01-10
      相关资源
      最近更新 更多