2017-09-28 18 views
0

내 스마트 폰의 LED를 켜고 끄는 방법으로 이진 코드를 전송하는 앱을 만들고 있습니다. for-loop에서 애플리케이션은 char에서 binary 코드로 이동하고 "1"이면 100ms 동안 LED를 깜박이고 "0"이면 100ms 동안 꺼집니다. 또한 바이너리 코드가 3 번 전송됩니다. 여기에 코드의 일부는 내가 사용 :LED를 통해 이진 코드를 보내는 Thread.sleep 대신 안드로이드 타이머

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; 
} 

그것은 않는 일이지만 유감 스럽지만에 Thread.sleep() 함수는 시간의 측면에서 매우 정확한 없습니다. Thread.sleep (100)을 입력하면 항상 100ms 이상이됩니다. 그래서 코드를 변경하고 timer.schedule() 메서드를 사용하여 타이머를 사용하려고 시도했습니다. 더 정확하기를 바랍니다. 하지만 타이머로 작동시키는 법을 이해하지 못했습니다.

타이머를 사용하여이 작업을 수행하는 방법을 보여 줄 수 있습니까? "1"과 "0"은 100ms 인터벌로 보내고 3 회 반복 할 수 있습니까?

+1

당신은 시스템 클럭 –

+0

@rollback보다 더 정확하지 않을 수 있습니까? 왜냐하면 나는 다른 주파수의 LED를 깜박 거리기 위해 Thread.sleep과 timer.schedule을 비교했기 때문에 타이머는 sleep 함수보다 낫다. – flash17

답변

0

Thread.sleep 때문에 현재 스레드가 이상 100ms이됩니다. 그렇다고해서 다음 문장이 100 밀리 초 이내에 실행되지는 않습니다. Timer는 다른 스레드를 사용하므로 UI ​​스레드에서 몇 가지 작업을 수행해야하는 경우 UI 스레드에 메시지를 게시해야합니다. 당신은 UI 스레드를 차단하지 않고 메시지를 지연 필요가있는 경우 - Handler.post 메시지 사용 : 더 나은 결과를 얻을 수있는 기회가 없다 그래서

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

위의 코드가 귀하의 경우에 작동하지 않을 정도로 코드를 깊이 파고 들지 않았습니다. Handler 사용법에 대한 예제 만 제공합니다. 덕분에 – Mike

+0

. 그것은 좋게 본다 그러나 나는 시간 문제에 더 나은지보기 위하여 약간 측정을해야한다. 그러나 그것은 3 번하지 않습니다. 딱 한번. – flash17

+0

그것은 작동합니다. 고마워요. – flash17