在 Android 中,一个线程可能有一个 Looper 或 MessageQueue。Handler用于向Thread的MessageQueue发送Message或post Runnable,必须始终与Thread的Looper或MessageQueue相关联。
方法一
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
当打开一个应用程序时,Android 会创建一个带有 Looper 和 MessageQueue 的新线程(称为主线程或 UI 线程),该线程用于渲染 UI 和处理来自用户的输入事件。
上面的代码是创建一个Handler并关联UI线程的Looper,所以runnable会排队到UI线程的MessageQueue中,稍后执行。
方法二
new Handler().post(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
创建一个Handler并关联当前线程的Looper,有3种情况:
- 如果这段代码是在 UI 线程上执行的,那么 runnable 会排队到 UI 线程的 MessageQueue 中,稍后再执行。
- 如果这段代码是在后台线程上执行的,如果这个线程有Looper,那么runnable会排队到后台线程的MessageQueue中,稍后再执行。
- 如果这段代码在后台线程上执行,并且该线程没有 Looper,则会抛出异常。
方法三
runOnUiThread(new Runnable() {
@Override
public void run() {
// Code here will run in UI thread
}
});
runOnUiThread只是 Activity 的一个实用方法,当你想在 UI 线程上执行一些代码时使用它。该方法背后的逻辑是如果当前线程是UI线程,则立即执行,否则使用Handler向UI线程的MessageQueue发送消息(如方法1)。