gpt4 book ai didi

java - 如何在标准 Java 中实现 Android 消息处理程序模式?

转载 作者:行者123 更新时间:2023-11-30 11:44:38 27 4
gpt4 key购买 nike

我正在编写一个通过蓝牙与 PC 通信的 Android 应用程序。在正常操作期间,它会以 >100Hz 的频率从手机快速连续发送 8 字节短数据包。

在每个设备上,一个单独的线程正在运行以执行写入和读取。代码如下所示:

/**
* The Class ProcessConnectionThread.
*/
public class ConnectedThread extends Thread {

/** The m connection. */
private StreamConnection mmConnection;


InputStream mmInputStream;
OutputStream mmOutputStream;

private boolean mmCanceled = false;

/**
* Instantiates a new process connection thread.
*
* @param connection
* the connection
*/
public ConnectedThread(StreamConnection connection) {
mmConnection = connection;
// prepare to receive data
try {
mmInputStream = mmConnection.openInputStream();
mmOutputStream = mmConnection.openOutputStream();
} catch (IOException e) {
e.printStackTrace();
}

}

/*
* (non-Javadoc)
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
byte[] buffer;
int bytes;

// Keep listening to the InputStream while connected
while (!mmCanceled) {
try {
buffer = ByteBufferFactory.getBuffer();
// Read from the InputStream
bytes = mmInputStream.read(buffer);
if(bytes > 0)
onBTMessageRead(buffer, bytes);
else
ByteBufferFactory.releaseBuffer(buffer);

} catch (IOException e) {
MyLog.log("Connection Terminated");
connectionLost();//Restarts service

break;
}
}

if(!mmCanceled){
onBTError(ERRORCODE_CONNECTION_LOST);
}
}

/**
* Write to the connected OutStream.
*
* @param buffer
* The bytes to write
* @param length
* the length
*/
public void write(byte[] buffer, int length) {
try {
mmOutputStream.write(buffer, 0, length);

// Share the sent message back to the UI Activity
onBTMessageWritten(buffer, length);
} catch (IOException e) {
MyLog.log("Exception during write:");
e.printStackTrace();
}
}


/**
* Cancel.
*/
public void cancel() {
try {
mmCanceled = true;
mmInputStream.close();
mmConnection.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}


}

Android 端代码几乎相同,只是使用 BluetoothSocket 而不是流连接。

最大的不同在于onBTMessageRead(buffer, bytes);

安卓功能:

protected void onBTMessageRead(byte[] buffer, int length) {
if (mHandler != null) {
mHandler.obtainMessage(BluetoothService.MESSAGE_READ, length, -1,
buffer).sendToTarget();
}
}

PC服务器功能:

protected void onBTMessageRead(byte[] message, int length) {
if (mEventListener != null) {
mEventListener.onBTMessageRead(message, length);
}
// Release the buffer
ByteBufferFactory.releaseBuffer(message);
}

Android 提供了一种处理程序-循环程序/消息模式,允许跨线程发送消息。这允许读取尽可能快地发生,并将消息处理排队到另一个线程中。我的 ByteBufferFactory 确保资源在线程之间正确共享。

目前我只有一个在 PC 端实现的事件监听器模式,但我也希望在 PC 端有一个类似的消息传递模式。目前,事件监听器使 ConnectedThread 停滞不前并导致严重的通信延迟。

有没有什么方法可以从 java 中的一个线程发送消息并让它们以 FIFO 顺序在另一个线程中异步处理?

最佳答案

嗯,也许你可以从 Android 的源代码中复制相关的东西?您至少需要:

如果它不是开箱即用的,请考虑将其作为“代码设计指南”

关于java - 如何在标准 Java 中实现 Android 消息处理程序模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10702622/

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