private class MyTask extends TimerTask {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
updateText(); //更新textView中的数据,里面有数据操作,不是简单的更新
break;
}
}
;
};
上面的代码很简单,一个TimerTask,一个Handler,定时叫handler去更新一些UI操作,其中这个UI操作是有耗时操作的,我们就姑且算这耗时操作为100毫秒吧。
但是这段代码看起来没啥问题啊,操作很简单,逻辑很简单。那么我们试一下运行一下上面的代码,在运行过程中把系统时间调大两天,再回到应用中,你会发现,你的应用很“成功”地卡死了。如果不知道原因可以在timerTask中的run()方法中添加一段Log打印一下日志
private class MyTask extends TimerTask {
@Override
public void run() {
Log.d("xxx","要更新UI啦");
mHandler.sendEmptyMessage(1);
}
}
再次按照上面的操作来,会发现当你回到应用的时候,会打印成千条“要更新UI啦",看到这里你大概明白为啥会出现UI卡死了,因为你把系统时间推后了,但TimerTask还是会继续运行,那么假如你推后了两天的时间,假如你的TimerTask的时间间隔是2s,那么就会运行了60*60824*2/2 =86400次,这样不卡死UI线程c出现ANR才怪呢。所以在写这类的代码的时候,要不就先运行mHanlder.removeMessage(1);,要不就在Activity的onPause()停止TimerTask。