Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:定时器点击问题_Android_Algorithm - Fatal编程技术网

Android:定时器点击问题

Android:定时器点击问题,android,algorithm,Android,Algorithm,嗨,我正在做我的一个项目,然后我遇到了这个问题,我不知道这是一个bug还是什么,我只是想和大家分享一下,希望得到一些答案来启发我的一天。问题是: 我为我的项目制作了一个倒计时计时器,它将运行2分钟(即120秒)1000是间隔时间(1000ms=1s),然后我设置了一个检查器,一个120的整数(声明为全局),它将在计时器每次滴答声时减少一个。整数将在文本视图上显示为倒计时。然后,当整数到达计时器的onFinish时,将显示一条消息。该消息将给出我将声明的整数减去120所花费的时间 这里的问题是计时

嗨,我正在做我的一个项目,然后我遇到了这个问题,我不知道这是一个bug还是什么,我只是想和大家分享一下,希望得到一些答案来启发我的一天。问题是:

我为我的项目制作了一个倒计时计时器,它将运行2分钟(即120秒)1000是间隔时间(1000ms=1s),然后我设置了一个检查器,一个120的整数(声明为全局),它将在计时器每次滴答声时减少一个。整数将在文本视图上显示为倒计时。然后,当整数到达计时器的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);
}
}
第一个*:这是您的类扩展了*
倒计时

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()
方法。