【Android開發實踐筆記1】解決Android定時器無法關閉/停止問題

引言

公司有一個項目需要Android APP應用實現,原嵌入式開發出身的我,爲了完成公司的項目,也參與了Android的研究。由於並沒有學習過Java,以及Android,在開發過程中也請教了不少身邊專注這方面的同學以及朋友,首先在此表示感謝。

問題引入

在開發過程中,需要改寫DEMO代碼實現功能,遇到了一個虛擬搖桿代碼,其工作思路是這樣的:
虛擬搖桿檢測到手指按下,並且向前,則開啓定時器以300us的速度根據搖桿的方向以及角度,計算出運動的速度,並且使用對應函數發送指令到硬件,實現控制。
當檢測到手指鬆開後,有一個彈回函數,負責將控制點彈回中心,並且將角度等設置爲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. 定時器的創建需要嚴謹,如果定時器對象非空,不應該再繼續創建定時器。

以上是剛剛入行的小程序猿在安卓開發過程中遇到的小問題,希望對你有所幫助,如有不清楚或者有誤還望各位多多指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章