问题一由来:Android项目中有一个自己写的实时模拟系统时钟的后台应用时间计时器,一开始用的Timer写的,后来发现Timer容易受系统时间的影响所以改成了ScheduledThreadPoolExecutor实现。但是上线给用户使用后不断反馈时间不精确,经常和网络时间相差10到30分钟,后来在网上查官方文档,感觉可能是ScheduledThreadPoolExecutor每秒计时有延迟执行造成的,希望有类似经验的朋友,说说这是什么原因导致的?
问题二:后来网上查发现用Handler实现一个后台时间计时器可能会更准确一点,先看代码
开一个线程去启动这个计时器时,计时器虽然在计时,但是好像一直在无限的递归
线程里面后面的代码也无法走下去了,麻烦各位大侠帮忙分析一下,按理说runnable也应当是相当于开了个线程啊,怎么就阻塞了
问题二:后来网上查发现用Handler实现一个后台时间计时器可能会更准确一点,先看代码
public class ServerTime {
private static ServerTime instance = null;
private Date baseDate = null;
private long timeValue = 0;
private Handler handler = null;
private Runnable runnable = null;
private ServerTime(){
Looper.prepare();
handler = new Handler();
baseDate = new Date();
}
public static ServerTime instance(){
if(instance==null){
instance = new ServerTime();
instance.startTimeTask();
}
return instance;
}
private void startTimeTask() {
runnable = new Runnable() {
@Override
public void run() {
try {
timeValue ++;
Log.e("ServerTime", "timeValue==" + timeValue);
handler.postAtTime(this, SystemClock.uptimeMillis() + 1*1000);
Looper.loop();
} catch (Exception e) {
e.printStackTrace();
log.error(TPCConfiguration.getStackTrace(e));
}
}
};
//handler.postDelayed(runnable, 1000);
handler.postAtTime(runnable, SystemClock.uptimeMillis() + 1*1000);
Looper.loop();
}
public void stopTimeTask() {
handler.removeCallbacks(runnable);
runnable = null;
//executor = null;
instance=null;
timeValue=0;
}
}
开一个线程去启动这个计时器时,计时器虽然在计时,但是好像一直在无限的递归
handler.postAtTime(runnable, SystemClock.uptimeMillis() + 1*1000);
线程里面后面的代码也无法走下去了,麻烦各位大侠帮忙分析一下,按理说runnable也应当是相当于开了个线程啊,怎么就阻塞了