android - Bluetooth: программа зависла при чтении входных потоков - PullRequest
2 голосов
/ 26 марта 2012

Helo.

Я занимаюсь разработкой приложения, которое передает данные через Bluetooth (с устройством записи полета). Когда я получаю много данных (3000 - 40000 строк текста, в зависимости от размера файла), мое приложение перестает получать данные. Я получаю данные с InputStream.read (буфер). Например: я посылаю команду на бортовой регистратор, он начинает посылать мне файл (строка за строкой), на моем телефоне я получаю 120 строк, а затем приложение зависает.

Интересно, что на моем HTC Desire приложение зависает только иногда, на телефоне Samsung 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 Ответ

3 голосов
/ 28 марта 2012

Кажется, что приложение застряло на "bytes = mmInStream.read (buffer);"

Но это нормальное поведение: InputStream.read (byte []) блокируется, когда естьбольше нет доступных данных.

Это говорит о том, что проблема в другом конце или в связи между устройствами.Возможно ли, что у вас есть проблема со связью (которая немного отличается в Галактике от Желания), которая препятствует получению большего количества данных?

Кроме того, я бы посоветовал вам обернуть попытку / пойматьвокруг оператора read, чтобы быть уверенным, что вы перехватываете любые возможные исключения IOException.Хотя я думаю, вы бы видели это в logcat, если бы это произошло.

Говоря о logcat, я бы посоветовал вам взглянуть на операторы logcat, которые генерирует сам Android.Я обнаружил, что он генерирует много для Bluetooth, и это может помочь вам выяснить, действительно ли есть еще данные для чтения ().

...