Как реализовать шаблон обработчика сообщений 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"

Другие вопросы по тегам