Android Timer update UI between multiple tasks

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-25 10:59:07

问题


I have tried multiple ways to have a single persistent timer update the ui in multiple activities, and nothing seems to work. I have tried an AsyncTask, a Handler, and a CountDownTimer. The code below does not execute the first Log.i statement.... Is there a better way to start the timer (which must be called from another class) in Main (which is the only persistent class)?

 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();
}

To clarify my problem:

When I run the code the Log.i("aaa","Timer running") statement is never shown in the log, and the CountDownTimer never seems to start. MainLawTimer is called from another class only (not within the same class.


回答1:


For CountDownTimer

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

You can use a 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();     

Timer

  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 ); 

You can use a AsyncTask or a Timer or a CountDownTimer.




回答2:


Thank you all for your help, I discovered the error in my code... timeLeft was in seconds rather then milliseconds. Since timeLeft was under 1000 (the wait period) the timer never started.



来源:https://stackoverflow.com/questions/17387115/android-timer-update-ui-between-multiple-tasks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!