2016-12-02 37 views
0

我試圖實現一個代碼,以HH:mm:ss格式顯示當前時間。我設法這樣做了,但似乎還有一段時間滯後於系統時間。代碼在Fragment中實現,如下所示。Android:TextView上的當前時間有時間滯後

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_alarm_list, null); 

    tvCurrentTime = (TextView) view.findViewById(R.id.tvCurrentTime); 
    tvCurrentTime.setText("H"); 
    timeHandler.sendEmptyMessage(0); 

    return view; 
} 
Handler timeHandler = new Handler() { 
    public void handleMessage(Message msg) { 
     runClock(); 
     timeHandler.sendEmptyMessageDelayed(0, 1000); 
    } 
}; 

private void runClock() { 
    Calendar calendar = Calendar.getInstance(); 
    tvCurrentTime.setText(String.format("%02d:%02d:%02d", 
      calendar.get(Calendar.HOUR_OF_DAY), 
      calendar.get(Calendar.MINUTE), 
      calendar.get(Calendar.SECOND))); 
} 

時滯似乎在0.5秒到1秒左右。這是我運行該代碼時的屏幕截圖。

enter image description here

+2

嘗試使用TextClock:https://開頭developer.android.com/reference/android/widget/TextClock.html試試這個。 – zerocool

回答

0

爲什麼你的滯後是由於timeHandler,因爲它不是從系統的同步秒,這意味着你的計時器可在0各個位置上運行的理由 - 1000毫秒。縮小間隔會增加顯示正確的機會,但不會修復它,因爲它取決於計時器何時啓動。

可以使用postAtTime它的處理程序,在像16特定時期運行:02:59:001,16:03:00:001,...

0

檢查這個代碼工作正確。

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 

View view = inflater.inflate(R.layout.fragment_alarm_list, null); 

tvCurrentTime = (TextView) view.findViewById(R.id.tvCurrentTime); 
tvCurrentTime.setText("H"); 
timeHandler.sendEmptyMessage(0); 

return view; 
} 
Handler timeHandler = new Handler() { 
public void handleMessage(Message msg) { 
    runClock(); 
    timeHandler.sendEmptyMessageDelayed(0, 500); 
} 
}; 
private void runClock() { 
Calendar calendar = Calendar.getInstance(); 
tvCurrentTime.setText(String.format("%02d:%02d:%02d", 
     Calendar.getInstance().get(Calendar.HOUR_OF_DAY), 
     Calendar.getInstance().get(Calendar.MINUTE), 
     Calendar.getInstance().get(Calendar.SECOND))); 
}