Таймер в Android не обновляется - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть таймер в Android для обратного отсчета до будущей даты, но он не обновляет.Любая помощь приветствуется.мой код размещен ниже:

public class Activity1 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    TextView t = (TextView)findViewById(R.id.countdown);

    t.setText(timeDif());

Я считаю, что t.setText просто необходимо постоянно обновлять, но я не уверен, как это сделать.

}

public String timeDif()
{

   GregorianCalendar then = new GregorianCalendar(2012, 07, 21, 6, 0, 0);
   Calendar now = Calendar.getInstance(); 

  long arriveMilli = then.getTimeInMillis();
  long nowMilli = now.getTimeInMillis(); 
  long diff = arriveMilli - nowMilli; 


  int seconds = (int) (diff  / 1000);
  int minutes = seconds / 60; 
  seconds %= 60; 
  int hours = minutes / 60; 
  minutes %= 60; 
  int days = hours / 24; 
  hours %= 24; 

  String time = days + ":" +zero(hours)+":"+zero(minutes)+":"+zero(seconds);

  return time;
}

private int zero(int hours) {
    // TODO Auto-generated method stub
    return 0;
}


} 

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Вы не должны делать это с таймером.Таймер использует поток, и он вам не нужен (а это усложняет вещи без необходимости).Для этого вам нужно использовать метод PostDelayed из Runable и Handler.Это легче и легче.

    Handler mHandler = new Handler();

    private Runnable mUpdateTimeTask = new Runnable() {
       public void run() {
             //update here 
             mHandler.postDelayed(mUpdateTimeTask, 100);
       }
    };

    private void startTimer()
    {
         mHandler.removeCallbacks(mUpdateTimeTask);
         mHandler.postDelayed(mUpdateTimeTask, 100);
    }

Вот отличный пример этого.

1 голос
/ 28 ноября 2011

Текстовое поле не будет обновляться, если вы не сделаете это в своем собственном потоке.Таймер работает в другом потоке, чем пользовательский интерфейс.Вот как я это сделал.

myTimer = new Timer();
myTimerTask = new TimerTask() {
@Override
public void run() {
   TimerMethod();
                    }
};
myTimer.schedule(myTimerTask, 0, 100);

private void TimerMethod()
{
    //This method is called directly by the timer
    //and runs in the same thread as the timer.
    //We call the method that will work with the UI
    //through the runOnUiThread method.
    if (isPaused != true) {
        this.tmrMilliSeconds--;
        this.runOnUiThread(Timer_Tick);
    }
}

private Runnable Timer_Tick = new Runnable() {
    public void run() {

    //This method runs in the same thread as the UI.               
        if (tmrSeconds > 0) {
            if (tmrMilliSeconds <= 0) {
                tmrSeconds--;
                tmrMilliSeconds = 9;
            }
        } else {
            Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
            v.vibrate(1000);
            myTimer.cancel();
            tmrSeconds = setTime;
            tmrMilliSeconds = 0;
            isPaused = true;
        }

    //Do something to the UI thread here
        timerText.setText(String.format("%03d.%d", tmrSeconds, tmrMilliSeconds));
    }
};

Это часть кода для часов обратного отсчета, которые я сделал для ап.Он демонстрирует, как запустить один поток (публичную часть void run ()), а затем другую часть, которая выполняется в потоке пользовательского интерфейса.Надеюсь, это поможет.

...