在长线程过程中更新 TextView

Posted

技术标签:

【中文标题】在长线程过程中更新 TextView【英文标题】:Update TextView during long Thread process 【发布时间】: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 或其他丑陋的代码 【参考方案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);
          
       );
    

【讨论】:

以上是关于在长线程过程中更新 TextView的主要内容,如果未能解决你的问题,请参考以下文章

计时器在长事件期间不启动

Java MVC:保持我的观点更新

Edittext 在长按时进行选择但不显示上下文菜单?

如何从 Web 应用程序中的另一个线程更新变量?

有关子线程对UI的线程更新的说法

如何在android一条单独线程,更新ui ?