直升机。
开发一个通过蓝牙传输数据的应用程序(使用飞行记录器设备)。当我收到大量数据(3000-40000行文本,取决于文件大小)时,我的应用似乎停止接收数据。我用InputStream.read(缓冲区)接收数据。例如:我向飞行记录器发送一个命令,它开始向我发送一个文件(逐行),在我的手机上我收到120行然后应用程序卡住了。
有趣的是,在我的HTC Desire上,应用程序有时卡住,在三星Galaxy S手机上,应用程序每次尝试重复超过50行都会卡住。
该代码基于BluetoothChat示例。这是我正在收听BluetoothSocket的代码部分:
byte[] buffer = new byte[1024];
int bytes =0;
while(true)
{
bytes = mmInStream.read(buffer);
readMessage = new String(buffer, 0, bytes);
Log.e("read", readMessage);
String read2 = readMessage;
//searching for the end of line to count the lines(the star means the start of the checksum)
int currentHits = read2.replaceAll("[^*]","").length();
nmbrOfTransferedFligts += currentHits;
.
.
.
//parsing and saving the recieved data
我必须说我在一个线程中的一个while(true)循环中运行它,这是在android服务中实现的。该应用似乎停留在“bytes = mmInStream.read(buffer);” 我试图用BufferedReader做到这一点,但没有成功。
感谢。
答案 0 :(得分:3)
应用似乎停留在“bytes = mmInStream.read(buffer);”
但这是正常行为:当没有更多可用数据时,InputStream.read(byte [])会阻塞。
这告诉我,问题出在另一端或设备之间的通信中。您是否可能存在通信问题(在Galaxy与Desire上有所不同),这会阻止接收更多数据?
另外,我建议你在read语句中包装一个try / catch,以确保捕获任何可能的IOException。虽然我猜你会在logcat中看到它,如果发生的话。
说到logcat,我建议你看一下Android本身生成的logcat语句。我发现它为蓝牙产生了很多,这可能会帮助你弄清楚是否还有更多的数据需要读取()。