2015-08-20 2 views
2

У меня есть две команды в Oncreate и оба отправляют данные на устройство Bluetooth. Мне нужна вторая команда, чтобы дождаться, когда строка данных будет получена от первой команды, прежде чем перейти ко второй команде. Каждая команда просто отправляет байт в BT. Я пробовал использовать цикл while true, но не работает шов и зависает в истинном выражении. Я предполагаю, что в то время как истина не позволяет обработчику срабатывать, когда в цикле. Обе команды работают отлично индивидуально, пока я не отправляю оба.Loop while true

Это код в OnCreate с обеих команд и в то время как истинное утверждение

looping=true; 

    intByteCount =9; 
    GetData(intCommand);  // (Command 1)Send byte to get data on reveiver 

    while(looping) {    // Wait add data to be received before next command 
     Log.d("TAG", "On Hold ? "); 
    } 

    intByteCount=160;   // (command 2) 
    GetTitle(intCommand); 

Это код в обработчике Bluetooth, который устанавливает зацикленной ложь, когда все байты были получены.

Handler h = new Handler() { 

    @Override 
    // public void handleMessage(android.os.Message msg) { 

    public void handleMessage(android.os.Message msg) { 
     byte[]readBuf = (byte[]) msg.obj; 


     if (intByteCount==9){ 
     // Data is channel status and Master value 
     byte[] encodedBytes = new byte[5]; 
     System.arraycopy(readBuf, 0, encodedBytes, 0, encodedBytes.length); 
     looping=false; 
     }; 

GetTitle и GetData в основном такие же Вот GetTitle()

private void GetData(int FixtureNumber) { 

    Log.d("TAG", "Value " + intArrayToInt(intArray1)); 

    intByteCount=9;       // set to receive 9 bytes 

    byte buffer[] = new byte[6]; 

    buffer[0] = ((byte) 1); // Command (get data) 
    buffer[1] = ((byte) Master_value); 
    buffer[2] = ((byte) intArrayToInt(intArray1)); 
    buffer[3] = ((byte) intArrayToInt(intArray2)); 

    buffer[4] = ((byte) 3); 
    buffer[5] = ((byte) 4); 

    if (isBTConnected) { 

     try { 
      mmOutputStream.write(buffer); 
     } catch (IOException e) { 

      e.printStackTrace(); 
     } 

    } 
} 

Вот окончательный код, чтобы получить как данные управления

 new Thread(new Runnable() { 
     @Override 
     public void run() { 

      intByteCount =9; 
      GetData(intCommand);  // Send byte to get data on reveiver 
      //you can use a for here and check if the command was executed or just wait and execute the 2nd command 
      try { 
       Thread.sleep(1000); //wait 2 seconds 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      intByteCount=160;   // Sed incoming data byte count 
      GetTitle(intCommand); 
     } 
    }).start(); 

ответ

2

Вы можете использовать тему и ждать й количество времени,:

new Thread(new Runnable() { 
    @Override 
    public void run() { 
     //your 1st command 

     //you can use a for here and check if the command was executed or just wait and execute the 2nd command 
     try { 
      Thread.sleep(2000); //wait 2 seconds 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     //your 2nd command 
    } 
}).start(); 
0

Вы в настоящее время холдинг там основной поток, что-то не рекомендуется делать. Лучшим вариантом для этого является изменение кода, чтобы вторая команда Bluetooth выполнялась в функции, которая вызывается, где используется цикл == false.

1

Спасибо Агустин, который работал хорошо. Полученные данные были быстрыми, поэтому просто задержка будет работать без логического управления. Вот новый код.

 new Thread(new Runnable() { 
     @Override 
     public void run() { 

      intByteCount =9; 
      GetData(intCommand);  // Send byte to get data on reveiver 
      //you can use a for here and check if the command was executed or just wait and execute the 2nd command 
      try { 
       Thread.sleep(1000); //wait 2 seconds 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      intByteCount=160;   // Sed incoming data byte count 
      GetTitle(intCommand); 
     } 
    }).start(); 
Смежные вопросы