2014-02-23 2 views
0

두 개의 Android 기기간에 시간을 동기화하려고합니다. 정밀도는 최대 5ms 여야합니다. gps와 네트워크 시간이 이처럼 정확하지 않아서 로컬 네트워크를 통해 장치간에 시간을 공유하고 PTP (Precision time protocol)를 사용하여 시간을 동기화하는 것에 대해 생각했습니다. 지금은 뿌리가 맞지 않는 기기의 시간을 변경할 수 없기 때문에 기기에서 공유하는 시차를 절약하고 사용자에게 텍스트보기로 시간을 보여 주겠다고 생각했습니다. 이제 사용자가 ms 단위로 시간을 볼 수 있도록 textview를 매 1ms마다 업데이트해야했습니다. ms마다 업데이트되는 스레드에서 textview를 업데이트 중입니다. 문제가 시간을 동기화 한 후, 시간은 diff 미만 5 밀리 것을 제공하지만, 시간 동기화의 시간이 후 일부를 표류하기 시작하고 10 ~ 15 분 후 시간은 diff입니다Android에서 동기화 시간이

class CountDownRunner implements Runnable { 
    // @Override 
    public void run() { 
     Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 
     while (!Thread.currentThread().isInterrupted()) { 
      try { 
       setCurrentTime(); 
       Thread.sleep(1); // Pause of 1/100 Second 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } catch (Exception e) { 
      } 
     } 
    } 
} 

입니다 1 초 이상. 이 문제를 해결하는 방법에 대한 아이디어가 있으십니까?

+0

elapsedRealtime() 전화의 현재 값이 "사용자가 너무 MS의 시간을 볼 수 있도록 이제 텍스트 뷰는 모두 MS를 업데이트 할 필요"- 첫째, 인간은 SECON 1000 명 변경 볼 수 없습니다 디. 둘째, Android는 실시간 운영체제가 아닙니다. 'Thread.sleep()'는 CPU가 다른 쓰레드를 수행하는 중일 수 있기 때문에 정확히 밀리 초 단위로 반환하지 않습니다. – CommonsWare

+0

매 초마다 UI를 업데이트하려고했지만 여전히 드리프트가 있습니다. thread.sleep (1000)을 thread.sleep (1003 또는 1004)처럼 작동시키는 것처럼 보이고 이러한 변경 사항이 더 커지면 더 큰 드리프트가 만들어집니다. . Thread.currentThread()를 사용합니다.setPriority (Thread.MAX_PRIORITY); 도와주지 않을거야? –

답변

0

가 (1000) 개에 Thread.sleep (1003 또는 1004) 같은 작품 Thread.sleep를 만드는 것 같아 이러한 변화는 내가 언급 한 바와 같이 큰 편차

을 위해 추가 계속, 안드로이드는 RTOS가 아닙니다.

또한 sleep()이 1003 또는 1004 밀리 초로 반환되는지 여부는 신경 쓰지 않아야합니다. 당신이

가이 서로와는 아무 상관이없는 현재 동기화 된 시간을 표시하는 시간

  • 동기화 이후 경과 된 시간을 결정

    • : 당신은 두 가지를 결합 할 것으로 보인다. 효율성을 위해 더 나은 아직, postDelayed(), 또는 - -

      sleep() 루프를 사용 제어 를 얻기 위해 약 매초마다 당신이 TextView를 업데이트 할 필요가 있음을 알 수 있습니다.

      TextView에 표시 할 값을 결정하려면 sleep()을 기반으로 가정 된 시간을 추가하지 마십시오. 대신 : 당신이 다른 장치에서 동기화 된 시간 값을 얻을 때

  • +0

    만약 내가 스레드 실행 사이의 시간을 찾아 그 시간을 빼면, 도움이 될 것입니다? –

    +0

    그리고 UI를 매 밀리 초마다 업데이트하는 것은 좋은 생각이 아니므로 매 100ms마다 업데이트 할 예정입니다. –

    관련 문제