gpt4 book ai didi

java - 无法理解 Android 蓝牙示例中的 mHandler.obtainMessage()

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:51:08 24 4
gpt4 key购买 nike

我正在处理蓝牙 rfcomm 连接。 Android Sample 中有一行我无法理解,不幸的是我在其他问题和资源中找不到好的答案。

完整代码如下:

public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()

// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
break;
}
}
}

/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}

我无法理解这一行:

 // Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();

mHandler 未在此代码中定义,MESSAGE_READ

我不明白 bytes 是做什么的?

我认为并且如评论中所述,它将接收到的字节发送到我设置为主 Activity 的 Activity 。我可以在我的主 Activity 中创建一个 Static TextView 而不是 sendToTarget() 来显示收到的消息吗?

最佳答案

Handler 的主要目标是提供生产者线程和消费者线程之间的接口(interface),这里是 UI 线程和工作线程之间的接口(interface)。 Handler 的实现进入消费者线程。

在您的情况下,您希望在线程之间传递 MESSAGE_READ

没有处理程序,您无法在主 Activity 线程中执行任何操作。

因此,寻找mHandler启动到主Activity。

默认的处理程序 init 应该是这样的:

Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
/**/
}
};

如果您使用 Eclipse,请单击您的项目 -> Ctrl+H -> 文件搜索 -> “处理程序”。

或者在 Notepad++ -> 搜索 -> 在文件中查找....

[编辑]

final int MESSAGE_READ = 9999; // its only identifier to tell to handler what to do with data you passed through.  

// Handler in DataTransferActivity
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case SOCKET_CONNECTED: {
mBluetoothConnection = (ConnectionThread) msg.obj;
if (!mServerMode)
mBluetoothConnection.write("this is a message".getBytes());
break;
}
case DATA_RECEIVED: {
data = (String) msg.obj;
tv.setText(data);
if (mServerMode)
mBluetoothConnection.write(data.getBytes());
}
case MESSAGE_READ:
// your code goes here

我确定你必须实现类似的东西:

new ConnectionThread(mBluetoothSocket, mHandler);

我找到的来源here

关于java - 无法理解 Android 蓝牙示例中的 mHandler.obtainMessage(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18030942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com