网络上发布了有关如何在UI线程上运行代码的不同方法。它们都完成相同的任务,但是,我真的很想知道这些方法之间的区别。
方法一:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
方法2:
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
方法3:
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
在 Android 中,一个线程可能有一个 Looper 或 MessageQueue。处理程序用于将消息或发布 Runnable 发送到线程的 MessageQueue,并且它必须始终与线程的 Looper 或 MessageQueue 相关联。
方法 1
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
打开应用时,Android 会创建一个带有 Looper 和 MessageQueue 的新线程(称为主线程或 UI 线程(,此线程用于呈现 UI 并处理来自用户的输入事件。
上面的代码是创建一个处理程序并与 UI 线程的 Looper 相关联,因此可运行的将排队到 UI 线程的 MessageQueue,并在稍后执行。
方法 2
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
创建一个处理程序并与当前线程的 Looper 关联,有 3 种情况:
- 如果此代码在 UI 线程上执行,则可运行对象将排队到 UI 线程的 MessageQueue,并在稍后执行。 如果此
- 代码在后台线程上执行,如果此线程具有 Looper,则可运行对象将排队到后台线程的 MessageQueue,并在稍后执行。
- 如果此代码在后台线程上执行,并且此线程没有 Looper,则会引发异常。
方法 3
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
runOnUiThread 只是 Activity 的一个实用工具方法,当您想在 UI 线程上执行一些代码时,它会使用它。此方法背后的逻辑是,如果当前线程是 UI 线程,则立即执行它,否则使用 Handler 将消息发布到 UI 线程的 MessageQueue(如方法 1(。
方法 1 将始终有效。
方法 2 仅在您已经在 UI 线程上时才有效 - 没有 Looper 参数的新处理程序会为当前线程创建一个处理程序(如果当前线程上没有 Looper,则失败(。
方法 3 需要在 Activity 中完成或在 Activity 对象上调用,因为 runOnUiThread 是 Activity 的一个函数。 但是在引擎盖下,它将执行与 1 相同的操作(尽管可能会保留一个处理程序以提高效率,而不是总是新的处理程序(。
所有方法的工作方式如下:
如果循环存在,则循环处理程序的方法 1
方法 2 处理程序可以在所有活动中工作,如果不是私有或想要
的方法 3 处理程序只能在当前活动中工作