2016-05-15 1 views
2

Я создал код, который считывает данные, переданные на мое устройство Android от Arduino. Это выглядит следующим образом:Создание условий внутри Runnable in android

public void run() { 
     byte[] buffer = new byte[1024]; 
     int bytes; 
     final StringBuilder readMessage = new StringBuilder(); 
     while (true) { 
      try { 
       bytes = connectedInputStream.read(buffer); 
       final String string_now = new String(buffer, 0, bytes); 
       readMessage.append(string_now); 
       // final int finalBytes = bytes; 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         tvBPM.setText(string_now); 
         readMessage.setLength(0); 
        } 
       }); 
      } catch (IOException e) { 
       Toast.makeText(getApplicationContext(),"Connection Lost!",Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

Этот код находится внутри моего «частного класса ThreadConnected расширяет тему» ​​

Теперь значения, принадлежащие string_now являются числами. Я хочу сказать пользователю, что хранимое там значение больше 150 или меньше 50. Вот код, который я пробовал, но я не полностью работаю.

runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        final int getValue = Integer.getValue(Integer.parseInt(string_now)); 
        if (getValue > 150 || getValue < 50) { 
         Toast.makeText(getApplicationContext, "Unstable", Toast.LENGTH_SHORT).show(); } 
        else { 
        tvBPM.setText(string_now); 
        readMessage.setLength(0); } 
       } 
      }); 

Любые советы о том, как я могу сделать эту работу? Спасибо.

+2

«Не полностью работать» не очень полезная информация. Можете ли вы предоставить больше информации о том, что вы ожидаете и что на самом деле происходит? –

+0

Код отображает значения сердечного ритма на tvBPM из прототипа, который я создал. Теперь я хочу, чтобы значения, показанные в tvBPM, были проверены, если они соответствуют условиям (т. Е. Инструкции if else). В настоящее время приложение просто закрывается после нажатия кнопки «Пуск», которая, в свою очередь, направляет поток, содержащий код runOnUiThread(). Извините за мой плохой английский – KCX

ответ

1
bytes = connectedInputStream.read(buffer); 
final String string_now = new String(buffer, 0, bytes); 

Этот код будет работать вечно, даже после того, как равноправный закрывает соединение, когда она начнет показывать мусор, давая ArrayIndexOutOfBoundsException, или любой другой. У вас не хватает следующих между этими двумя линиями:

if (bytes == -1) 
{ 
    break; 
} 

и следующий после catch блока:

finally 
{ 
    try 
    { 
     connectedInputStream.close(); 
    } 
    catch (IOException exc) 
    { 
     // whatever ... 
    } 
} 
+0

Я вижу. Но я удалил эти два кода выше, потому что он должен поймать все значения из arduino, пока он включен. Спасибо, что указали на это. – KCX

+0

Он не может ничего поймать после того, как Ардуино отключился. Других значений для «уловки» нет. Вам нужно будет снова подключиться или дождаться повторного подключения партнера. – EJP

Смежные вопросы