Android:定时器点击问题
嗨,我正在做我的一个项目,然后我遇到了这个问题,我不知道这是一个bug还是什么,我只是想和大家分享一下,希望得到一些答案来启发我的一天。问题是: 我为我的项目制作了一个倒计时计时器,它将运行2分钟(即120秒)1000是间隔时间(1000ms=1s),然后我设置了一个检查器,一个120的整数(声明为全局),它将在计时器每次滴答声时减少一个。整数将在文本视图上显示为倒计时。然后,当整数到达计时器的onFinish时,将显示一条消息。该消息将给出我将声明的整数减去120所花费的时间 这里的问题是计时器在达到1之前停止,因为它不会被最后一个滴答声扣除。最困难的部分是,有时它会在剩余时间停止4甚至5次。有人能帮我解决这个问题吗?提前谢谢 以下是我进一步理解的代码:Android:定时器点击问题,android,algorithm,Android,Algorithm,嗨,我正在做我的一个项目,然后我遇到了这个问题,我不知道这是一个bug还是什么,我只是想和大家分享一下,希望得到一些答案来启发我的一天。问题是: 我为我的项目制作了一个倒计时计时器,它将运行2分钟(即120秒)1000是间隔时间(1000ms=1s),然后我设置了一个检查器,一个120的整数(声明为全局),它将在计时器每次滴答声时减少一个。整数将在文本视图上显示为倒计时。然后,当整数到达计时器的onFinish时,将显示一条消息。该消息将给出我将声明的整数减去120所花费的时间 这里的问题是计时
//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);
}
}
第一个*:这是您的类扩展了*倒计时
:
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 the GameTimer and pass the context to it
GameTimer gameTimer = new GameTimer(this, 120000, 1000);
gameTimer.start();
尝试将上下文传递给倒计时程序,当您想在文本视图上显示计时器时,应该使用Activity.runOnUIThread(新的Runnable);请明确,当调用onFinish()
回调时,endtime
值大于1?(或2、3、4等)endtime的值应为:120,因为timer的值每秒钟递减1:)。所以我认为这是谁调用UI的问题,倒计时是一个线程,但他不是UI线程,这就是为什么我说他应该将上下文传递给他的类并重写runOnUIThread()方法。你认为MeLight怎么样?@MeLight不,问题是当onFinish()启动时,timer1值会随机停止在2、3、4或5的值上。对不起,这部分,所以请忽略它,因为我仍然在工作,我忘了删除该部分。我的错。顺便说一下@Houcine抱歉,我只是一个android开发的初学者。我不熟悉runOnUIThread(),但现在你已经讨论过了,我想我会在阅读这篇文章时试一试。谢谢你。嗨,Houcine,很抱歉我需要一段时间才能回复这个问题,我也测试了这个问题,但是我的模拟器的结果是一样的。嗯,我想我以前没有提到这个问题,这个问题只发生在我的模拟器中,到那时我还没有在实际的android手机上进行测试。我在这台电脑上做了一个测试,发现MillisonTilFinished没有给出预期值(MillisonTilFinished-interval=expectedValue),我认为这是问题的主要原因,因此我得出结论,这只是一个模拟器问题。现在我在手机上测试了这个问题,计时器工作正常。我已经读到了你给我的那个,并且发现这将优化我的工作,所以再次感谢你给我这个。m()m感谢start()
方法。