【Android开发实践笔记1】解决Android定时器无法关闭/停止问题

引言

公司有一个项目需要Android APP应用实现,原嵌入式开发出身的我,为了完成公司的项目,也参与了Android的研究。由于并没有学习过Java,以及Android,在开发过程中也请教了不少身边专注这方面的同学以及朋友,首先在此表示感谢。

问题引入

在开发过程中,需要改写DEMO代码实现功能,遇到了一个虚拟摇杆代码,其工作思路是这样的:
虚拟摇杆检测到手指按下,并且向前,则开启定时器以300ms的速度根据摇杆的方向以及角度,计算出运动的速度,并且使用对应函数发送指令到硬件,实现控制。
当检测到手指松开后,有一个弹回函数,负责将控制点弹回中心,并且将角度等设置为0,最重要的是,将刚刚创建的定时器关闭。
在这里插入图片描述
经过输出框以及日志验证后,我发现这个定时器并没有正常关闭,而是一直在不断执行,可是关闭定时器的代码又确实有执行。

DEMO代码预览

//执行代码
@Override
public boolean onTouchEvent(MotionEvent event){
	switch(action & MotionEvent.ACTION_MASK){
	case MotionEvent.ACTION_DOWN:{ //当摇杆按下
	onTouchDown();
	break;
	case MotionEvent.ACTION_UP:{//当摇杆弹起
	onTouchUp();
	break;
	}
}
	
private void onTouchDown(){
	cmdTimer = new Timer();  //New一个新的对象用于创建新的定时器
	cmdTask = new TimerTask(){
	@Override
	public void run(){
	//指定定时工作程序
			}
		};
	}
	cmdTimer.schedule(cmdTask,0,300);
}

private void OnTouchUp(){
...//一些让界面回到原点,以及角度为0的代码省略
	if(cmdTask!= null && cmdTimer!=null){
//关闭定时器代码
			cmdTask.cancel();
            cmdTimer.cancel();
            cmdTimer.purge();
	}

问题答案

程序在运行过程中,手指按下摇杆的时候,多次执行OnTouchDown函数,每次执行都会创建定时器,而关闭定时器只能关闭其中一个,因此定时器依然存在

问题解决方案

1、增加代码严谨度

//创建定时器时应该这样写
if (cmdTimer==null){
            cmdTimer = new Timer();
        }
if (cmdTask==null){
            cmdTask = new TimerTask() {
            //增加一个判断语句,判断任务以及时间是否为null
//关闭定时器时应该设置为null
        if (cmdTask != null && cmdTimer != null){
            Log.d("Tell3", "Stop timer ---");
            cmdTask.cancel();
            cmdTimer.cancel();
            cmdTimer.purge();
            cmdTask=null;
            cmdTimer=null;
            Down_flag=0;
        }

2、添加定时器标志位,定时器正常打开后,标志位置1,使函数不会被多次调用:

case MotionEvent.ACTION_DOWN:{ //当摇杆按下
if(Timer_flag==0){
	onTouchDown();
	}
	break;

问题总结

  1. 定时器的创建以及关闭,是有针对性的,关闭只能关闭指定一个,因此使用定时器的时应该注意是哪一个。
  2. 定时器的创建需要严谨,如果定时器对象非空,不应该再继续创建定时器。

以上是刚刚入行的小程序猿在安卓开发过程中遇到的小问题,希望对你有所帮助,如有不清楚或者有误还望各位多多指点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值