在android中使用Activity.runOnUiThread
或Handler.post(runnable action)
之间有什么区别/优点/缺点?
答案 0 :(得分:23)
Activity.runOnUiThread,就像它的名字所暗示的那样,将在当前负责UI的线程中执行Runnable。因此,如果您有CPU密集型任务,它可能会使UI在短时间内无响应。相反,Handler提供了一种方法来创建线程,运行一些代码,并在完成后通知UI(即Handler.sendMessage)。
Handler的文档比我更好地说明了这一点:
为您的流程创建流程时 应用程序,它的主要线程是 致力于运行消息队列 负责管理 顶级应用程序对象 (活动,广播接收器等) 以及他们创造的任何窗户。您可以 创建自己的线程,和 与主要沟通 应用程序线程通过Handler。 这是通过调用同一个帖子来完成的 或者像以前一样使用sendMessage方法 从你的新线程。给定的 Runnable或Message将是 在Handler的消息中安排 排队并在适当的时候进行处理。
答案 1 :(得分:0)
Activity.runOnUiThread()
是更通用的处理程序的特例。使用Handler
,您可以在自己的线程中创建自己的事件查询。使用使用默认构造函数实例化的处理程序并不代表"代码将在UI线程上运行"一般来说。默认情况下,处理程序绑定到从中实例化的Thread。
要创建保证绑定到UI(主)线程的Handler,您应该创建绑定到Main Looper的Handlerobject,如下所示:
Handler mHandler = new Handler(Looper.getMainLooper());
此外,如果你检查runOnuiThread()
方法的实现,它正在使用Handler来做这些事情:
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}
正如您从上面的代码片段中看到的,如果从UI线程调用runOnUiThread()
,则会立即执行Runnable操作。否则,它会将其发布到Handler,稍后将在某个时间执行。
答案 2 :(得分:0)
请参见here。如果在UiThread
中立即调用runOnUiThread()
,则在处理完所有消息后将调用post()
。如果不在其他线程中,则runOnUiThread()
与post()
相同。
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
}
}