关于Timer类偶尔出现为null,实际上却不为null的问题

关于Timer类偶尔出现为null,实际上却不为null的问题

大学毕业后工作2年多了,这是第一次写博客。以前大学老师都说写博客面试是加分项,当时不知道怎么重视,可能是觉得反正我不会的百度都能查到,就没写了。。现在看着同学博客龄都3年了,我还没写过,有点相形见秽的感觉,哈哈。这里我记录一下项目中遇到的一些问题,无论简易,都记录下来,方便自己纠错,也方便大家纠错,最主要的是记录自己成长的道路。

现在的问题是这样的,设置了一个Timer类,10秒后还未接收到返回,如果弹窗还在就去掉,就去掉,并且作出提示。

private Timer myTimer;

myTimer = new Timer();
myTimer .schedule(new TimerTask() {
                        @Override
                        public void run() {
                            getActivity().runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if(timerLD.isShowing()){timerLD.dismiss();}
									Toast.makeText(getActivity(), getResources().getString(R.string.unlocking_failure), Toast.LENGTH_SHORT).show();
                                }
                            });

                        }
                    },10000);//10秒内未接收到蓝牙,自动关闭显示器

在接收到返回数据后,就把定时器关掉。按道理,这是没什么问题的。然而。。。在APP第一次进来还好,多跳几次activity就程序闪退了,一看是myTimer类NPE异常,为null报错。。。前面已经new了怎么还会null,行吧,那就加上null判断,然而控制台偶尔打印出来的是null,有时候却是不为null,有点头大。。。

case cof.UART_CMD_SET_LOCK_OPEN:
            if(timerLD.isShowing()){timerLD.dismiss();}Log.e("测试淡出timerLD开锁","sssss");
            //不管受到成功还是失败,都去掉加载框
			Log.e("开锁成功后myTimer去掉前前前","myTimermyTimer" + (myTimer == null));
            if(myTimer != null){
				Log.e("开锁成功后myTimer去掉","myTimermyTimer");
            	myTimer.cancel();myTimer.purge();myTimer = null;
            	}

大胆猜测一下,应该是线程太多,JVM的GC机制把Timer类回收了,但是Timer里面的线程却还存在,导致Timer类为null,却依然执行里面的方法。这里把Timer类设置为static类,看能不能解决问题。

private static Timer myTimer;

在这里插入图片描述
果然运行下去了,打印的日志随便写的,别在意细节。
当然也可以在timer里面的方法判断值的方式解决问题。这里的解决方式是设置timer类为static类,让JVM不回收timer类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值