Android Timer在多个任务之间更新UI

时间:2013-06-30 04:18:26

标签: android timer timertask

我已尝试过多种方法让一个持久计时器在多个活动中更新ui,似乎没有任何工作。我尝试过AsyncTask,Handler和CountDownTimer。下面的代码不执行第一个Log.i语句....有没有更好的方法来启动Main(这是唯一的持久类)中的计时器(必须从另一个类调用)?

 public static void MainLawTimer()
{
    MainActivity.lawTimer = new CountDownTimer(MainActivity.timeLeft, 1000) 
    {
           public void onTick(long millisUntilFinished) 
           {
               Log.i("aaa","Timer running. Time left: "+MainActivity.timeLeft);
              MainActivity.timeLeft--; 

              if(MainActivity.timeLeft<=0)
              {
                //do stuff
              }
              else
              {
                  //call method in another class                          
              }  
           }
public void onFinish() 
           {  }
    }.start();
}

澄清我的问题:

当我运行代码时,Log.i(“aaa”,“Timer running”)语句永远不会显示在日志中,并且CountDownTimer似乎永远不会启动。 MainLawTimer仅从另一个类调用(不在同一个类中。

2 个答案:

答案 0 :(得分:1)

对于CountDownTimer

http://developer.android.com/reference/android/os/CountDownTimer.html

您可以使用Handler

Handler m_handler;
Runnable m_handlerTask ; 
int timeleft=100;
m_handler = new Handler(); 
@Override
public void run() {
if(timeleft>=0)
{  
     // do stuff
     Log.i("timeleft",""+timeleft);
     timeleft--; 
}      
else
{
  m_handler.removeCallbacks(m_handlerTask); // cancel run
} 
  m_handler.postDelayed(m_handlerTask, 1000); 
 }
 };
 m_handlerTask.run();     

定时器

  int timeleft=100;
  Timer _t = new Timer();  
  _t.scheduleAtFixedRate( new TimerTask() {
            @Override
            public void run() {

               runOnUiThread(new Runnable() //run on ui thread
                 {
                  public void run() 
                  { 
                    Log.i("timeleft",""+timeleft);  
                    //update ui

                  }
                 });
                 if(timeleft>==0)
                 { 
                 timeleft--; 
                 } 
                 else
                 {
                 _t.cancel();
                 }
            }
        }, 1000, 1000 ); 

您可以使用AsyncTaskTimerCountDownTimer

答案 1 :(得分:0)

谢谢大家的帮助,我在我的代码中发现了错误... timeLeft是几秒钟而不是毫秒。由于timeLeft低于1000(等待期),计时器从未开始。