【发布时间】: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 或其他丑陋的代码