Я действительно смущен этим, и я пытаюсь отлаживать за прошедшие три дня. Надеюсь, кто-то сможет сказать мне, что я делаю неправильно.Реализация BlockingQueue Buffer, используемого в Bluetooth Communication for Android
Я реализую буфер BlockingQueue (FIFO), чтобы получать информацию, передаваемую с моего ПК через Bluetooth. Я посылаю предварительно записанный сигнал электрокардиограммы по гипертерминальной ссылке, используя RealTerm.
Я протестировал буфер при запуске приложения, добавив значения, а затем удалив их, и, похоже, он работает так, как должен.
Проблема возникает, когда я пытаюсь сохранить в буфере, пока я получаю данные от соединения Bluetooth. Я не знаю, добавляю ли я быстрее, чем BlockingQueue может справиться, но когда я останавливаю передачу данных и проверяю свой буфер, весь буфер содержит последнее добавленное значение. Размер буфера правильный, но контент отсутствует.
Вот мой буфер:
public class IncomingBuffer {
private static final String TAG = "IncomingBuffer";
private BlockingQueue<byte[]> inBuffer;
public IncomingBuffer() {
inBuffer = new LinkedBlockingQueue<byte[]>();
Log.i(TAG, "Initialized");
}
public int getSize() {
int size;
size = inBuffer.size();
return size;
}
// Inserts the specified element into this queue, if possible. Returns True
// if successful.
public boolean insert(byte[] element) {
Log.i(TAG, "Inserting " + element[0]);
boolean success = inBuffer.offer(element);
return success;
}
// Retrieves and removes the head of this queue, or null if this queue is
// empty.
public byte[] retrieve() {
Log.i(TAG, "Retrieving");
return inBuffer.remove();
}
// Retrieves, but does not remove, the head of this queue, returning null if
// this queue is empty.
public byte[] peek() {
Log.i(TAG, "Peeking");
return inBuffer.peek();
}
}
Часть моего класса BluetoothCommunication, который получает информацию и отправляет его в буфер заключается в следующем:
public void run() {
Log.i(TAG, "BEGIN mConnectedThread");
ringBuffer = new IncomingBuffer();
byte[] buffer = new byte[1024];
Log.i(TAG, "Declared buffer byte");
int bytes;
byte[] retrieve;
int size;
Log.i(TAG, "Declared int bytes");
//Setting up desired data format 8
write(helloworld);
Log.i(TAG, "Call write(initialize)");
// Keep listening to the InputStream while connected
while (true) {
try {
Log.i(TAG, "Trying to get message");
// Read from the InputStream
bytes = mmInStream.read(buffer);
//THIS IS WHERE THE BYTE ARRAY IS ADDED TO THE IncomingBuffer
RingBuffer.insert(buffer);
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
Log.i(TAG, "Sent to target" +ringBuffer.getSize());
} catch (IOException e) {
Log.e(TAG, "disconnected", e);
connectionLost();
// Start the service over to restart listening mode
BluetoothCommService.this.start();
break;
}
}
}
Так пример моей проблемы будет be:
Отправлять значения по соединению Bluetooth (8 бит от 1 до 20). В методе вставки класса IncomingBuffer сообщение журнала подтверждает, что отправлено правильное значение. Когда значения извлекаются из буфера, он содержит двадцать байт-массивов, которые содержат последний вставленный номер (20).
Любая подсказка относительно того, почему буфер работал бы в других обстоятельствах, но не во время связи с Bluetooth?