【发布时间】:2011-09-17 06:16:02
【问题描述】:
有区别吗
new Handler.post(Runnable r);
和
activity.runOnUiThread(Runnable r)
【问题讨论】:
有区别吗
new Handler.post(Runnable r);
和
activity.runOnUiThread(Runnable r)
【问题讨论】:
来自官方Handler docs
处理程序
处理程序有两个主要用途:
(1) 安排消息和可运行文件作为某个时间点执行 未来。
(2) 将要在不同线程上执行的操作排入队列 你自己的。
简而言之,Handler就是用来管理不同的Runnables的。
runOnUiThread
用于对UI Thread执行非UI操作,示例 如果你想从 AsyncTask 的 doInBackground() 更新屏幕 您必须编写更新 UI 内部的代码部分 运行OnUiThread()。但这又会阻止 UI。
【讨论】:
runOnUiThread 基本上适合在调用AsyncTask 之前显示进度对话框或进行一些 UI 操作。
如果您想在线程执行过程中更新 UI,那么最好的方法是创建一个 Handler 来更新您的 UI,并让线程继续运行,例如,在执行几次后定期更新文本视图秒,比如说计时器功能。
【讨论】:
Handler 附加到创建它的线程。
handler.post(Runnable) 可用于在 Handler 所附加的线程上运行代码。
Activity.runOnUIThread(Runnable) 总是在活动的 UIThread 上运行给定的可运行对象。在内部,它是通过一个处理程序 Activity 在构造时创建的:
final Handler mHandler = new Handler();
因此 runonUiThrad 代码如下所示:
public final void More ...runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
您可以看到当前线程是否不是 UI 线程,它会将给定的 runnable 发布到我们之前提到的成员处理程序上。 如果调用者已经在 ui 线程上,它只会调用 runnable。
Rad 代码here。
【讨论】: