Android中可以采用Timer+Handler
或者单纯使用Handler
的方法来实现定时通知的功能,但是采用Handler的方法会更好,优点不仅仅在于代码量会少很多,更主要在使用于Timer会产生bug。
使用Timer+Handler的方式
这种方式在TimerTask的run
方法中sendMessage给Handler,实现定时操作的目的,但是使用Timer本身会出现一种问题,看下面的实验代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| TimerTask timerTask = new TimerTask() { @Override public void run() { print("first"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } print("second"); } };
Timer timer = new Timer(); timer.schedule(timerTask, 0, 1000);
|
愿意是想立即执行一次这样的任务:先输出first
,隔2秒再输出second
,然后再隔1秒,再执行一次同样的任务,但是当执行过后就会发现,second
输出完之后会马上输出first
,并没有延迟1秒,问题就在于timer的时间延迟是从任务开始执行时就已经计算了,并不是上一次任务执行完成后才计算的,因此这个任务执行了2秒,其实第二次任务已经开始执行了,但是是单队列,所以并没有马上出现,但是下一次已经不会再如我们所愿的延迟1秒了(但是它其实也按照它自己的方式延迟了1秒,也就是它不在乎任务有没有执行完,我自己发出命令就开始计算1秒,然后再发出命令),因此这种方式可能会出现问题。
只使用Handler的方式
这种方式既简单也没有风险:
1
| handler.sendEmptyMessageDelayed(MSG_TIME_COUNT, 1000);
|
一句代码即可搞定,会延迟1秒发送消息给handleMessage
来处理,而且每次是等任务执行完才会开始延迟。