关于handler在非主线程中充当计时器使用的疑问

问题一由来:Android项目中有一个自己写的实时模拟系统时钟的后台应用时间计时器,一开始用的Timer写的,后来发现Timer容易受系统时间的影响所以改成了ScheduledThreadPoolExecutor实现。但是上线给用户使用后不断反馈时间不精确,经常和网络时间相差10到30分钟,后来在网上查官方文档,感觉可能是ScheduledThreadPoolExecutor每秒计时有延迟执行造成的,希望有类似经验的朋友,说说这是什么原因导致的?

问题二:后来网上查发现用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也应当是相当于开了个线程啊,怎么就阻塞了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值