受信したデータを保存し、Bluetooth経由で非同期に送信するarraylistがあります。
arraylist にアクセスするための書き込みスレッドと読み取りスレッドがあります。Bluetoothエコーをシミュレートしようとしています(Bluetoothは、送信したすべてのものをエコーバックすることです)。
private class ReadThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
byte[] buffer = new byte[64];
if (mInputStream == null) return;
size = mInputStream.read(buffer);
if (size == 64) {
if (bufferList.isEmpty()){
Log.i("AOK Fail","Nothing to AOK");
}
if (compareByte(buffer,bufferList.get(0) == true) // Compare data in this 2 byte array
bufferList.remove(0);
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
private class WriteThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
try {
count++;
if (bufferList.isEmpty() == false && count < 3){
write(bufferList.get(0));
count = 0;
}else{
// Drop data after 3 fail attempt
bufferList.remove(0);
count=0;
}
Thread.sleep(500);
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
ボタンを押すと、データが送信されます。ゆっくり送信するとうまくいきます。ただし、すばやくクリックし始めると失敗します(送信用のデータをキューに入れます)。AOK Fail メッセージを受け取ったら。新たにデータを追加しても、残りのデータはすべて AOK Fail になります。どうしてこんなことに
それがスレッド化の問題である場合、すべてのデータが送信された後に解決されるべきではありませんか?