2011-09-20 48 views
4

嗨我正在對我的一個項目工作,然後我遇到了這個問題,以及我不知道它是一個錯誤還是我只是想分享希望得到一些答案來啓發我的天。所以這裏的問題:Android:定時器onTick問題

我做了一個倒計時器爲我的項目將運行2分鐘(這將是120秒)1000是間隔時間(1000ms = 1s)然後我設置一個檢查器,一個整數120 (全局聲明),每次計時器滴答時會減少一個。整數將顯示在textView倒數。然後當整數到達定時器的onFinish時會顯示一條消息。這個消息將給我多少時間,我通過扣除聲明的整數120來花費。

這裏的問題是計時器在它達到1之前停止,因爲它不會被最後一個計時器扣除。最難的部分是,有時在剩餘時間內停止4次甚至5次。任何人都可以幫我解釋這個嗎?提前致謝!

這是我做進一步的瞭解代碼:

//declared a timer 
int timer = 120; 

//starts the timer 
gameTimer = new gameTimer(120000, 1000); 
    gameTimer.start(); 

private class gameTimer extends CountDownTimer{ 
public gameTimer(long startTime, long interval) 
{ 
    super(startTime, interval); 
} 

public void onTick(long millisUntilFinished) 
{ 
    //on tick deduct timer by 1 
    timer -= 1; 
    TextView timer1 = (TextView)findViewById(R.id.textView1);   
    timer1.setText(""+timer); 
} 

public void onFinish() 
{ 
    //PERFORM END ACTION UPON FINISHING THE GAME 
    endtime = 120 - timer; 
    TextView endtime1 = (TextView)findViewById(R.id.textView2); 
    1.setText(""+endtime); 
} 
} 
+0

嘗試上下文傳遞到您的CountDownTimer,當你想在TextView中顯示的定時器,你應該使用Activity.runOnUIThread(新的Runnable); – Houcine

+0

只要說清楚,'onFinish()'回調觸發時,'endtime'值大於1? (或者2,3,4等) – MeLight

+0

endtime的值應該爲:120,因爲定時器的值每次減少1次seconde :)。所以我認爲這是誰調用UI的問題,countDownTimer是一個線程,但他不是一個UI THread,這就是爲什麼我說他應該將上下文傳遞給他的類並重寫方法runOnUIThread()。你怎麼看MeLight? – Houcine

回答

4

首先 * :這是你的類,它擴展了 * CountDownTimer

public class GameTimer extends CountDownTimer{ 

private YourActivity context; 
private int timer = 120; 
private int endtime; 
private TextView timer1,endTime1; 

public gameTimer(YourActivity context, long startTime, long interval) 
{ 
    // passing the context of your activity 
    this.context = context; 

    //get the textView to display results 
    timer1 = (TextView)this.context.findViewById(R.id.textView1); 
    endTime1 = (TextView)this.context.findViewById(R.id.textView2); 

    super(startTime, interval); 
} 

public void onTick(long millisUntilFinished) 
{ 
    //on tick deduct timer by 1 
    timer -= 1; 

    //override the method runOnUIThread 
    context.runOnUiThread(new Runnable(){ 

     @override 
     public void run(){ 
     timer1.setText(""+timer); 
     } 
    });   

} 

public void onFinish() 
{ 
    //PERFORM END ACTION UPON FINISHING THE GAME 
    endtime = 120 - timer; 

    //override the method runOnUIThread 
    context.runOnUiThread(new Runnable(){ 

     @override 
     public void run(){ 
     endTime1.setText(""+endtime); 
     } 
    }); 

} 
} 

二:您的活動(上方法onCreate(),instanciate你的GameTimer並啓動它:

//instanciate the GameTimer and pass the context to it 
GameTimer gameTimer = new GameTimer(this, 120000, 1000); 
    gameTimer.start(); 
+0

嗨Houcine,對不起,我需要一段時間來回答這個問題,好吧,我也測試了這個,但結果和我的模擬器一樣。那麼,我認爲我之前沒有提到過,這個問題只發生在我的模擬器中,到那時我還沒有在實際的android手機上測試過。我對這個進行了測試,發現millisUntilFinished沒有給出期望值(millisUntilFinished-interval = expectedValue),我認爲這是問題的主要原因,因此我認爲這只是一個模擬器問題。 – KaHeL

+0

現在,我已經在我的手機上測試過了,計時器正常工作。我讀過關於你給的一個,發現這會優化我的工作,所以再次感謝這個。 m(_ _)m – KaHeL

+0

很高興能聽到:) – Houcine