2014-09-25 5 views
0

Bluetooth Следующий код взят из hereTrouble понимание вход и выход андроида

Может кто-то пожалуйста, объясните, в глубоком, как это работает?

Что это за обработчик и что он делает?

Как выполняется условие while ?.

Как проходит цикл?

У меня очень грубое понимание того, как работает код, это очень приносит мне пользу, если вы можете мне помочь. Спасибо.

{ 
    final Handler handler = new Handler(); 
    final byte delimiter = 10; //This is the ASCII code for a newline character 

    stopWorker = false; 
    readBufferPosition = 0; 
    readBuffer = new byte[1024]; 
    workerThread = new Thread(new Runnable() 
    { 
     public void run() 
     {     
      while(!Thread.currentThread().isInterrupted() && !stopWorker) 
      { 
       try 
       { 
        int bytesAvailable = mmInputStream.available();       
        if(bytesAvailable > 0) 
        { 
         byte[] packetBytes = new byte[bytesAvailable]; 
         mmInputStream.read(packetBytes); 
         for(int i=0;i<bytesAvailable;i++) 
         { 
          byte b = packetBytes[i]; 
          if(b == delimiter) 
          { 
           byte[] encodedBytes = new byte[readBufferPosition]; 
           System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length); 
           final String data = new String(encodedBytes, "US-ASCII"); 
           readBufferPosition = 0; 

           handler.post(new Runnable() 
           { 
            public void run() 
            { 
             myLabel.setText(data); 
            } 
           }); 
          } 
          else 
          { 
           readBuffer[readBufferPosition++] = b; 
          } 
         } 
        } 
       } 
       catch (IOException ex) 
       { 
        stopWorker = true; 
       } 
      } 
     } 
    }); 

    workerThread.start(); 
} 

void sendData() throws IOException 
{ 
    String msg = myTextbox.getText().toString(); 
    msg += "\n"; 
    mmOutputStream.write(msg.getBytes()); 
    myLabel.setText("Data Sent"); 
} 

ответ

0

Обязательно узнайте, что такое нить, или я могу ее прояснить. Код, который вы предоставляете, как вы должны знать, определяет ваш рабочийThread. Все, что написано в методе run, будет запущено в другом потоке, как только вы вызовете start() в этом потоке. Все переменные, определенные до запуска, определяются в основном потоке. Так же и обработчик.

Обработчик предназначен для соединения двух потоков. Вы определяете его в одном потоке (здесь основной поток перед методом run), и вы используете его в другом потоке (в методе run) для выполнения некоторого действия в потоке, где он был определен. Так что в вашем коде, вы звоните

handler.post(new Runnable() 
          { 
           public void run() 
           { 
            myLabel.setText(data); 
           } 
          }); 

от WorkerThread, так

myLabel.setText(data); 

будет выполняться из основного потока (в потоке, в котором был реализованным обработчик).

Почему это так? Потому что .setText() не может быть вызван из другого потока, кроме основного потока, поскольку он что-то рисует.

во время проверки цикла, что нить не была прервана (на Android или что-то еще), и что логический stopWorker не был изменен, так что не было никаких исключений выброшены при чтении вашего InputStream

try {} catch() {} - это просто способ управления исключениями.

.доступный() метод дает вам количество байтов, которые вы можете прочитать из inpuStream, вызывая метод .read(). Если есть несколько доступных байтов (так что если вы получили что-то от подключенного устройства, то он читает его.

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

Затем он обрабатывает байты, полученные ...

Но для меня это не является эффективным решением, поскольку поток будет цикл очень быстро, в то время как .read() представляет собой метод блокировки, так что все части проверки того, что проверка наличия некоторых доступных байтов бесполезна и даже неэффективна. .read() заставит поток спать до тех пор, пока не появятся новые байты и, таким образом, освободят ресурсы. Возможно, есть еще одна причина, почему код делает это, но я не вижу этого.

Надеюсь, что это ясно.

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