2015-01-03 37 views
0

請讓我在執行某些操作之間獲得流逝的時間有問題。代碼是爲了在1分鐘(60,000毫秒)後執行一個動作,但是當我在我的模擬器上運行代碼時,經過的時間差通常比預期的要小,並且通常接近Thread.sleep()中的值。我曾嘗試使用System.nanoTime()甚至SystemClock.uptimeMillis()...我在正常的Java環境中做了類似的事情,它工作正常。問題可能來自模擬器,有沒有辦法做到這一點?使用System.currentTimeMillis所花費的時間在android上不能工作

 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

如果你只想每分鐘執行一次動作,那麼使用'BroadcastReceiver'來註冊'ACTION_TIME_TICK' - 參見http://developer.android.com/reference/android/content/Intent.html #ACTION_TIME_TICK – Squonk

+0

@Abdi thnx注意它。它應該是elapsedTime – user3572546

回答

-1

那是因爲你在while循環分配startTime,這意味着,在循環的最後一次迭代它分配給了時間,這將作爲唯一的線程睡眠時間,因爲你可以計算提及。 你應該在循環前分配它。

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

你需要實現一個廣播回覆器,它將在時間被觸發。

+0

哇thnx ...這真的很好,我會試試看,並給出答案 – user3572546

相關問題