引言
公司有一个项目需要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;
问题总结
- 定时器的创建以及关闭,是有针对性的,关闭只能关闭指定一个,因此使用定时器的时应该注意是哪一个。
- 定时器的创建需要严谨,如果定时器对象非空,不应该再继续创建定时器。
以上是刚刚入行的小程序猿在安卓开发过程中遇到的小问题,希望对你有所帮助,如有不清楚或者有误还望各位多多指点。