2015-01-03 2 views
0

제발 몇 가지 작업을 수행하는 사이에 경과 시간을 얻는 데 문제가 있습니다. 이 코드는 1 분 (60,000 밀리 초) 후에 액션을 수행하기위한 것이지만, 에뮬레이터에서 코드를 실행할 때 일반적으로 경과 시간의 차이는 예상보다 작고 종종 Thread.sleep()의 값에 가깝습니다. System.nanoTime() 및 심지어 SystemClock.uptimeMillis() 사용하여 시도했다 ... 나는 정상적인 Java 환경에서 비슷한 일을 그것은 잘 작동했다. 에뮬레이터에서 문제가 발생할 수 있으며이를 수행 할 수있는 방법이 있습니까? 당신이 while 루프에서 startTime를 할당하고 그 그것은 당신로만 스레드 수면 시간으로 계산됩니다 있도록 루프의 마지막 반복에서 해당 시간에 할당한다는 것을 의미하기 때문이다System.currentTimeMillis를 사용한 경과 시간이 안드로이드에서 작동하지 않습니다

 long startTime=0; 
    long elapsedTime=0; 
    long totalTime = 0; 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     while (running) { 

      startTime = System.currentTimeMillis(); 
      totalTime += elapsedTime; 
      Log.d("elapsed","displaying time...."+elapsedTime); 

      if(totalTime > 60000){ 
       Log.d("mins","one mins gone"); 
       totalTime = 0; 
      } 

       // do some other things here 

     try { 
      Thread.sleep(9000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


      elapsedTime = System.currentTimeMillis() - startTime; 

     } 

    } 
+0

endTime 변수는 어디에 선언 했습니까? – Abdi

+0

1 분마다 한 번 동작을 수행하고 'ACTION_TIME_TICK'을 듣기 위해 등록 된 'BroadcastReceiver'를 사용하면됩니다. http://developer.android.com/reference/android/content/Intent.html을 참조하십시오. #ACTION_TIME_TICK – Squonk

+0

@Abdi thnx가이를 알았습니다. 그것 elapsedTime 일 예정이다 – user3572546

답변

-1

말하는. 루프 앞에 할당해야합니다.

0

System.currentTimeMillis()가 작동해야합니다. 그러나 그것이 귀하의 상황에 적합한 지 확실하지 않습니다. 스레드를 잠자기 상태로 두는 것이 시간 관련 작업을 수행하는 최선의 방법은 아닙니다.

버전 5.0을 사용하는 경우 JobScheduler API를 사용할 수 있습니다.

5.0 이하 버전의 경우 AlarmManager을 한 번 또는 반복적으로 사용하십시오.

AlarmManager alarm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, _YOURBroadcastReceiver.class); 
    intent.putExtra(ONE_TIME, Boolean.FALSE); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 9000 , pi); 

시간이되면 트리거되는 브로드 캐스트 reveiver를 구현해야합니다.

+0

와우 thnx ... 이것은 실제로 좋다. 나는 그것을 시험해보고 그것이 어떻게 진행되는지에 대한 답을 줄 것이다. – user3572546

관련 문제