我有一个数组列表,它存储了我通过蓝牙异步接收和传输的数据。
我有一个写线程和一个读线程来访问arraylist。我正在尝试模拟蓝牙回声(蓝牙是为了回显我发送的所有内容)。
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失败消息。所有剩余的数据都将是AOK失败,即使是新添加的数据。为什么会这样呢?
如果是线程问题,不是应该在传输完所有数据后再解决吗?
发布于 2013-07-17 21:11:51
此bufferList变量是线程安全对象吗?就像数组阻止列表之类的?如果不是,您可能在尝试同时添加/删除itens时遇到一些问题。
这将在生产者线程中导致异常,不会传输任何其他内容,您将获得"Nothing to AOk“日志。
发布于 2013-07-18 22:04:09
不太清楚这段代码是如何工作的,因为它没有包含一些细节:
bufferList的,它的类型是什么?也许就是你在问题中提到的ArrayList?ArrayList不是线程安全的请看ArrayList documentation for Android.write方法做什么?compareByte方法做什么?这看起来很明显,但最好还是看一下代码,以防万一(另外,您还遗漏了一个bracket).count变量?您是否在此代码之外递增count值?如果这是真的,那么当count >= 3 (else块)时,您可能会从bufferList变量中删除所有内容。如果你这样做了,你的bufferList.isEmpty() == false && count < 3条件的第一部分有时可能是假的,因为你的bufferList将是空的;然后你将执行else块,试图从一个空的ArrayList中删除一个元素,你的代码将抛出一个IndexOutOfBoudsException (参见ArrayList remove method documentation),你的WriteThread将被中止。https://stackoverflow.com/questions/17700162
复制相似问题