HandlerThread的用法

本文探讨了Android中HandlerThread类的应用及与Handler类之间的消息传递机制。通过具体实例展示了如何创建并启动HandlerThread,以及如何利用Handler进行线程间的通信。
/* {

HandlerThread ht = new HandlerThread("MyThread");
ht.start();
handler = new Handler(ht.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
// TODO Auto-generated method stub
int tmp = msg.arg1;
System.out.println(Thread.currentThread().getId() + "::::::::::::" + tmp);
return false;
}
});

@Override
public void handleMessage(Message msg) {
switch(msg.what) {
case 0:
map.put("commend", true);
commBtn.setBackgroundResource(R.drawable.comm_pressed);
break;
default:break;
}
super.handleMessage(msg);
}
});*/
### 使用 Android HandlerThread 的基本步骤 HandlerThread 是 Android 提供的一个便捷类,用于在子线程中创建带有 Looper 的线程,从而简化 Handler 的使用。以下是其基本使用方法: #### 创建 HandlerThread 实例 首先,创建一个 HandlerThread 实例,并传入线程名称作为参数。这有助于在调试时识别线程[^2]。 ```java HandlerThread mHandlerThread = new HandlerThread("handler-thread"); ``` #### 启动线程 调用 `start()` 方法启动线程。这是非常重要的一步,因为只有调用了 `start()` 方法后,线程才会开始运行,并且 Looper 才会被创建[^2]。 ```java mHandlerThread.start(); ``` #### 创建 Handler 实例 接下来,创建一个 Handler 实例。可以通过 `mHandlerThread.getLooper()` 获取到 Looper 对象,并将其作为参数传递给 Handler 的构造函数。此外,还可以提供一个 Callback 回调接口来处理消息[^2]。 ```java Handler mHandler = new Handler(mHandlerThread.getLooper(), msg -> { // 在这里处理消息,通常是执行耗时操作 return false; }); ``` #### 发送消息 通过 Handler 实例发送消息,可以使用 `sendEmptyMessage()` 或者 `sendMessage()` 方法发送消息。 ```java mHandler.sendEmptyMessage(0); ``` #### 销毁 HandlerThread 当任务执行完毕或者页面销毁时,可以手动调用 `quit()` 方法来销毁 HandlerThread[^2]。 ```java mHandlerThread.quit(); ``` ### HandlerThread 的特点 HandlerThread 的 `run()` 方法中包含了 Looper 的准备和循环过程。它会调用 `Looper.prepare()` 来创建一个新的 Looper,并通过 `Looper.loop()` 开始消息循环。这样就可以确保 HandlerThread 能够处理消息队列中的消息[^4]。 ### 示例代码 下面是一个完整的示例代码,展示了如何使用 HandlerThread 来处理消息: ```java public class MainActivity extends AppCompatActivity { private HandlerThread mHandlerThread; private Handler mHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 创建 HandlerThread 实例 mHandlerThread = new HandlerThread("handler-thread"); // 启动线程 mHandlerThread.start(); // 创建 Handler 实例 mHandler = new Handler(mHandlerThread.getLooper(), msg -> { // 在这里处理消息,通常是执行耗时操作 Log.d("handler", "消息:" + msg.what + " 线程:" + Thread.currentThread().getName()); return false; }); // 发送消息 mHandler.sendEmptyMessage(1); mHandler.sendEmptyMessage(2); } @Override protected void onDestroy() { super.onDestroy(); // 销毁 HandlerThread mHandlerThread.quit(); } } ``` ### 日志输出 运行上述代码后,可以在 Logcat 中看到类似以下的日志输出: ``` /com.app D/handler: 消息: 1 线程: handler-thread /com.app D/handler: 消息: 2 线程: handler-thread ``` 这表明消息确实是在指定的 HandlerThread 中被处理的[^3]。 ### 注意事项 - 确保在不再需要 HandlerThread 时调用 `quit()` 方法,以释放资源。 - 如果需要在主线程中更新 UI,则应该在主线程中创建 Handler,并且在子线程中使用 `post()` 方法来更新 UI。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值