在长线程过程中更新 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); );
如您所见,我在线程和活动中都使用了Handler
s,因为我不确定哪个正确使用。但是,结果始终是整个 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的主要内容,如果未能解决你的问题,请参考以下文章