Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用。
基本用法
Timer timer=new Timer();
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
//你要定时执行的任务
}
};
timer.schedule(timerTask,1000,3000);//1000为延迟时间,3000为间隔时间
//单位ms
踩坑1:
我想把定时任务为改变text View的值,发现崩溃报错。
原因:Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。但是Android中修改控件属性的地方只能在UI线程里,而Timer处于另外的新线程,包括Java中的sleep()也是在新线程里去延时。
也就是说子线程是不可以更新UI的,为什么子线程中不能更新UI,这是因为在子线程中更新UI不是线程安全的,在Android源码ViewRootImpl的checkThread方法中也对UI做了验证。
void checkThread() {
if (mThread != Thread.currentThread()) {
throw new CalledFromWrongThreadException(
"Only the original thread that created a view hierarchy can touch its views.");
}
}
那线程之间的数据传输,是依靠Handle来实现。要实现UI刷新,需要在主线程(UI线程),用Handle获取Timer线程的数据
踩坑2:
android studio最新版本自动检测出代码中内存泄漏等问题
Handler 类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那 么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。