TimerTask可能导致的ANR

    

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。

转载于:https://my.oschina.net/u/3729396/blog/1591483

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值