Handler handler = new Handler(Looper.myLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case WHAT_BT_CONNECT_OK: broadcastEvent(OnEventListener.CONNECT_SUCCESS); break; case WHAR_BT_DISCONNECT_OK: broadcastEvent(OnEventListener.DISCONNECT_SUCCESS); break; case WHAT_BT_ACCEPT_OK: broadcastEvent(OnEventListener.ACCEPT_SUCCESS); break; case WHAT_BT_CONNECT_NG: broadcastEvent(OnEventListener.CONNECT_FAILED); break; case WHAT_BT_RECV_DATA: broadcastReceivedData((String)msg.obj); break; case WHAT_BT_RECV_INTERUPT: broadcastEvent(OnEventListener.BREAK_OFF); break; } } };
时间: 2024-02-10 12:19:44 浏览: 114
这段代码定义了一个Handler对象,用于处理消息。在这个Handler中,通过重写handleMessage方法,通过switch语句处理不同的消息,根据消息的what属性值,执行不同的操作,其中包括广播不同的事件,比如连接成功、断开成功、接收成功等,以及接收到的数据。这个Handler可以在Android中用于处理各种异步操作的结果返回。
相关问题
private static final int WHAT_BT_ACCEPT_OK = 3; Handler handler = new Handler(Looper.myLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case WHAT_BT_ACCEPT_OK: BluetoothSocket socket = (BluetoothSocket) msg.obj; if(onAcceptListener != null) onAcceptListener.onAccepted(socket); break; } } };
这段代码定义了一个 `Handler` 对象 `handler`,用于处理蓝牙通信过程中的消息。在构造函数中,通过 `Looper.myLooper()` 获取当前线程的消息队列,并将其作为参数传入,以创建一个与当前线程关联的 `Handler` 对象。在 `handleMessage()` 方法中,根据传入的消息类型 `msg.what` 进行不同的处理。如果消息类型是 `WHAT_BT_ACCEPT_OK`,则将消息中的 `obj` 强制转换为 `BluetoothSocket` 对象,并调用 `onAcceptListener` 的 `onAccepted()` 方法,将该 `BluetoothSocket` 对象作为参数传递给它。其中,`onAcceptListener` 是一个自定义的接口,用于处理蓝牙通信的连接请求。
如何实现:Looper循环 - 确认 Looper 循环已经在适当的地方运行(例如,在 onCreate() 中调用了 Looper.loop())。如果没有活跃的 Looper,那么 Handler 发送的消息将不会得到处理。
在Android应用中,`Looper`和`Handler`机制通常用于UI线程的消息传递以及避免在主线程中执行耗时操作。如果需要确认`Looper`循环已在适当的地方运行,比如在`onCreate()`方法中,首先应确保创建了一个与该`Looper`关联的`Handler`实例,并且有消息通过这个`Handler`发送出去。
示例代码展示了如何在一个Activity中初始化一个具有相关`Looper`的`Handler`:
```kotlin
private val cameraHandler = Handler(Looper.getMainLooper())
```
在这个场景下,`Looper.getMainLooper()`会获取应用程序主线程中的`Looper`对象,这是默认为UI线程准备好的`Looper`。接下来,定义了一个`Handler` `cameraHandler`来接收并处理来自任何地方发送给它的消息。
为了保证消息能够被正确地处理,你需要确保持有的`Looper`处于工作状态。一般情况下,Android系统已经为主线程配置好了`Looper`,因此不需要显式调用`Looper.loop()`。然而,如果你希望在非UI线程如后台线程上使用`Looper`/`Handler`机制,则必须自行设置此线程的`Looper`,并通过启动无限循环`Looper.loop()`来开始其生命周期。
下面是如何在一个新线程中手动创建`Looper`的例子:
```kotlin
val thread = Thread {
Looper.prepare()
val localLooper = Looper.myLooper()
// 创建一个与当前线程的Looper相关的Handler
val handler = object : Handler(localLooper!!) {
override fun handleMessage(msg: Message) {
// 处理消息...
}
}
// 开始消息队列的无限循环
Looper.loop()
}
thread.start()
```
以上步骤确保了当消息被`Handler`发出时,即使不是在主线程内也可以被相应`Looper`所管理的消息队列捕获并且执行。注意一旦调用了`Looper.loop()`方法之后,该线程就会阻塞在此处,直到应用结束或明确要求`Looper`停止运作。
阅读全文