2016-04-27 114 views
2

我正在嘗試創建一個每秒記錄一次跑步者位置的Android應用程序。但是,我發現它完成後需要稍多於一秒的時間。正好循環一秒

這裏是我的代碼:

Runnable run = new Runnable() { 
    @Override 
    public void run() { 
     Long start = SystemClock.elapsedRealtime(); 
     if (getIfRunning() == true) { 
      try { 
       if (location2 != null) { 
        Float distanceFromLast = totalDistance(location2); 
        addToDistance(distanceFromLast); 
       } 
       getCoords(); 
       mMap.clear(); 
       markOldCoords(); 
       writeCoords(); 
       setCount(); 
       updateScreen(); 
      } catch (Exception e) { 
      } 
     } 
     Long time = SystemClock.elapsedRealtime() - start; 
     handler.postDelayed(this, 1000 - time); 
    } 
}; 
handler.post(run); 
+0

[Javadoc](http://developer.android.com/reference/android/os/Handler.html#postDelayed%28java.lang.Runnable,%20long%29):*導致Runnable r被添加到消息隊列,在**經過指定的時間後運行** *因此,在指定的時間,它不會在指定的時間運行*完全*。 – Andreas

+0

你可以做的一件事是......創建你自己的'HandlerThread',並將你的'Handler'基於此。爲什麼?如果使用'Handler'的默認構造函數,那麼使用UI線程很可能(取決於構建它的位置)。那麼,許多其他的東西也會使用這個線程,所以你的'Runnable'必須滿足該線程的其他用法。 –

+0

大病請嘗試!感謝您的幫助 –

回答

5

一般來說,你不能讓這樣的確切時間。由於系統當時還在做什麼,定時器總是會早晚起牀。你所能做的最好的就是接受它永遠不會完美,並相應地更新你的代碼以找出你實際觸發的時間。

+0

對於更好的方法有任何建議,5分鐘後關閉約15秒,對大多數用戶來說不夠準確。 –

+0

@NathanMay記住第一個*時間戳,然後計算等待時間,以防止累積歪斜,這是您現在正在經歷的。 – Andreas

+0

@Andreas是不是我已經做了什麼?我發現調用方法之前的時間,他們被調用後,找到差異。對不起,新的 –