android - 蓝牙:程序卡在输入流读取

时间:2012-03-26 18:54:54

标签: android bluetooth inputstream

直升机。

开发一个通过蓝牙传输数据的应用程序(使用飞行记录器设备)。当我收到大量数据(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做到这一点,但没有成功。

感谢。

1 个答案:

答案 0 :(得分:3)

  

应用似乎停留在“bytes = mmInStream.read(buffer);”

但这是正常行为:当没有更多可用数据时,InputStream.read(byte [])会阻塞。

这告诉我,问题出在另一端或设备之间的通信中。您是否可能存在通信问题(在Galaxy与Desire上有所不同),这会阻止接收更多数据?

另外,我建议你在read语句中包装一个try / catch,以确保捕获任何可能的IOException。虽然我猜你会在logcat中看到它,如果发生的话。

说到logcat,我建议你看一下Android本身生成的logcat语句。我发现它为蓝牙产生了很多,这可能会帮助你弄清楚是否还有更多的数据需要读取()。