Как реализовать шаблон обработчика сообщений Android в стандартной Java?
Я пишу приложение для Android, которое связывается с ПК через Bluetooth. Во время нормальной работы он отправляет быстрые последовательности коротких 8-байтовых пакетов с телефона на ПК, обычно на частоте>100 Гц.
На каждом устройстве работает отдельный поток, который выполняет запись и чтение. Код выглядит так:
/**
* 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 практически идентичен, просто используется сокет Bluetooth вместо потокового соединения.
Большая разница в onBTMessageRead(buffer, bytes);
Функция Android:
protected void onBTMessageRead(byte[] buffer, int length) {
if (mHandler != null) {
mHandler.obtainMessage(BluetoothService.MESSAGE_READ, length, -1,
buffer).sendToTarget();
}
}
Функция ПК-сервера:
protected void onBTMessageRead(byte[] message, int length) {
if (mEventListener != null) {
mEventListener.onBTMessageRead(message, length);
}
// Release the buffer
ByteBufferFactory.releaseBuffer(message);
}
Android предоставляет шаблон обработчика / зацикливания / сообщения, который позволяет отправлять сообщения между потоками. Это позволяет выполнять чтение как можно быстрее и ставит в очередь обработку сообщений в другом потоке. Мой ByteBufferFactory обеспечивает правильное распределение ресурсов между потоками.
В настоящее время у меня есть только шаблон прослушивания событий, реализованный на стороне ПК, но я бы хотел, чтобы аналогичный шаблон передачи сообщений также был на стороне ПК. В настоящее время прослушиватель событий завершает работу ConnectedThread и вызывает существенную задержку связи.
Есть ли способ отправлять сообщения из одного потока в java и обрабатывать их асинхронно в другом потоке в порядке FIFO?
1 ответ
Хм, может быть, вы можете просто скопировать соответствующие вещи из исходного кода Android? Вам понадобится как минимум:
Если он не работает "из коробки", подумайте о том, чтобы принять его как "Code-Design-Guideline"