handler.sendMessage 和handler.post 有什么区别
时间: 2023-12-24 15:03:26 浏览: 45
`handler.sendMessage()` 和 `handler.post()` 都是用于将消息传递给 Handler 处理的方法,但是它们的使用有一些区别。
`handler.sendMessage()` 方法是在消息队列中插入一条消息,并立即返回,这意味着它是同步的。也就是说,如果你调用了 `handler.sendMessage()`,那么它会等待 Handler 处理完该消息后才会继续执行下面的代码。
`handler.post()` 方法是将一条消息投递到消息队列中,并返回 true。这是一个异步操作,意味着投递的消息会在稍后的某个时间被 Handler 处理。也就是说,如果你调用了 `handler.post()`,那么它不会等待 Handler 处理完该消息,而是会立即继续执行下面的代码。
因此,如果你需要立即执行某些代码,而不必等待 Handler 处理完消息后再执行,那么应该使用 `handler.post()` 方法。如果你需要等待 Handler 处理完消息后再执行下面的代码,那么应该使用 `handler.sendMessage()` 方法。
相关问题
handler的post与sendmessage的区别和应用场景
在 Android 中,`Handler` 是一种用于在不同线程之间进行通信的机制。`post()` 和 `sendMessage()` 都是 `Handler` 用来发送消息的方法,它们的主要区别在于:
1. `post()` 方法是将一个 `Runnable` 对象放入 `Handler` 消息队列中,等待 `Looper` 循环中的下一个消息处理时执行。而 `sendMessage()` 方法是将一个 `Message` 对象放入消息队列中,等待 `Looper` 循环中的下一个消息处理时执行。
2. `post()` 方法的参数是一个 `Runnable` 对象,可以直接在 `run()` 方法中执行任务。`sendMessage()` 方法的参数是一个 `Message` 对象,需要通过 `Handler` 的 `handlerMessage()` 方法来处理消息。
因此,`post()` 方法适用于需要在 UI 线程中更新界面的场景,而 `sendMessage()` 方法适用于需要在后台线程中执行任务并将结果返回到 UI 线程的场景。
例如,当我们需要在后台线程中执行一些耗时的任务,然后在 UI 线程中更新界面的时候,可以使用 `sendMessage()` 方法。我们可以在后台线程中执行任务,然后将结果封装在 `Message` 对象中发送给 `Handler`,在 `handlerMessage()` 方法中更新 UI 界面。
另外,需要注意的是,如果需要在 UI 线程中执行一些任务,但是当前线程已经是 UI 线程,可以使用 `post()` 方法,避免创建新的消息对象。
安卓handler用法
安卓中的Handler是一种消息处理机制,用于在不同的线程之间传递消息和执行任务。它的主要用途是在后台线程中执行一些耗时的任务,然后将处理结果传递给UI线程更新UI界面。
使用Handler的步骤如下:
1. 在UI线程中创建Handler对象,并重写它的handleMessage()方法。该方法会在后台线程发送消息时被调用,并在UI线程中执行处理任务的代码。
```
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 在UI线程中执行处理任务的代码
}
};
```
2. 在后台线程中发送消息。可以通过调用Handler的sendMessage()方法或post()方法来发送消息。
```
handler.sendMessage(handler.obtainMessage(1, "Hello"));
```
```
handler.post(new Runnable() {
@Override
public void run() {
// 在后台线程中执行耗时任务的代码
// 然后调用handler.sendEmptyMessage()或handler.sendMessage()方法发送消息
}
});
```
3. 在handleMessage()方法中处理消息。可以通过Message对象的what属性和obj属性获取消息的内容。
```
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
String message = (String) msg.obj;
// 处理消息的代码
break;
}
}
```
需要注意的是,Handler必须在UI线程中创建,因为它会与UI线程的消息循环相关联。如果在后台线程中创建Handler,会导致程序崩溃或出现其他异常。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)