2017-09-28 4 views
0

Ich arbeite an einer App, um Binärcode über das Ein-/Ausschalten der LED meines Smartphones zu übertragen. In einer For-Schleife geht die App von Char zu Char des Binärcodes und wenn es eine "1" gibt, blinkt die LED für 100ms und wenn es eine "0" gibt, ist sie für 100ms ausgeschaltet. Auch der Binärcode wird 3 mal gesendet. Hier ein Teil der Code, den ich verwendet:Android Timer anstelle von Thread.sleep zum Senden von Binärcode über LED

public void turnOnOff() { 
    if (button) { 
     button = false; 
     Camera.Parameters parametersOn = camera.getParameters(); 
     Camera.Parameters parametersOff = parameters; 
     parametersOn.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     parametersOff.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 

     try { 
      for (int a = 0; a < 3; a++){ 
       for (int i = 0; i < data.length(); i++){ 

          if (data.charAt(i) == '1') { 
            camera.setParameters(parametersOn); 
            camera.startPreview(); 
            Thread.sleep(100); 
          } else { 
            camera.setParameters(parametersOff); 
            camera.startPreview(); 
            Thread.sleep(100); 
            } 
       } 
      } 
     } catch (Exception e) { 

     } 
    } 
    button = true; 
} 

Es funktioniert aber leider die Thread.sleep() Funktion ist nicht sehr genau in Bezug auf die Zeit. Wenn ich Thread.sleep (100) eintippe, sind es immer mehr als 100ms. Also habe ich versucht, den Code zu ändern und einen Timer mit timer.schedule() -Methode zu verwenden, weil ich hoffe, dass es genauer ist. Aber ich konnte einfach nicht herausfinden, wie es mit einem Timer funktioniert.

Kann jemand mir zeigen, wie man diese Aufgabe mit einem Timer arbeiten lässt, so dass die "Einsen" und "Nullen" in einem Intervall von 100 ms gesendet werden und es 3 mal wiederholen?

+1

Sie nicht genauer als die Systemuhr –

+0

@rollback werden kann, so gibt es keine Chance, bessere Ergebnisse zu bekommen? Weil ich Thread.sleep und timer.schedule verglichen habe, um nur die LED in verschiedenen Frequenzen zu blinken und der Timer war viel besser als die Schlaffunktion. – flash17

Antwort

0

Thread.sleep verursacht Ihr aktuelles Thread zu schlafen mindestens 100ms. Dies bedeutet nicht, dass Ihre nächste Anweisung in 100 ms ausgeführt wird. Timer verwendet einen anderen Thread. Wenn Sie also eine Aktion für den UI-Thread ausführen müssen, müssen Sie die Nachricht im UI-Thread veröffentlichen. Wenn Sie Nachricht brauchen verzögert, ohne dass die UI-Thread blockiert - verwenden Handler.post Nachricht:

Handler handler = new Handler(); 
try { 
    for (int a = 1; a <= 3; a++) { 
     for (int i = 0; i < data.length(); i++) { 

      if (data.charAt(i) == '1') { 
       handler.postDelayed(new Runnable() { 
        @Override public void run() { 
         camera.setParameters(parametersOn); 
         camera.startPreview(); 
        } 
       }, i * 100); 
      } else { 
       handler.postDelayed(new Runnable() { 
        @Override public void run() { 
         camera.setParameters(parametersOff); 
         camera.startPreview(); 
        } 
       }, i * 100); 
      } 
     } 
    } 
} catch (Exception e) { 

} 
+0

Ich habe nicht tief in Ihren Code gegraben, so dass der obige Code in Ihrem Fall nicht funktioniert. Es ist nur ein Beispiel für die Verwendung von Handlern. – Mike

+0

danke. Es sieht gut aus, aber ich muss einige Messungen machen, um zu sehen, ob es mit dem Zeitproblem besser ist. Aber es tut es nicht 3 mal. nur einmal. – flash17

+0

Es funktioniert. vielen Dank. – flash17

Verwandte Themen