0

将来の日付までカウントダウンするためのタイマーが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;
}


} 
4

2 に答える 2

1

独自のスレッドで実行しない限り、テキストボックスは更新されません。タイマーは、UI とは異なるスレッドで実行されます。これが私がやった方法です。

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

これは、アプリ用に作成したカウント ダウン クロックのコードの一部です。これは、1 つのスレッド (public void run()) 部分を実行し、次に UI スレッドで実行する別の部分を実行する方法を示しています。それが役立つことを願っています。

于 2011-11-28T01:24:17.180 に答える
1

タイマーでこれを行うべきではありません。タイマーはスレッドを使用しますが、スレッドは必要ありません (そして、必要以上に複雑になります)。それを行うには、Runable および Handler の postDelayed メソッドを使用する必要があります。それはより簡単で軽量です。

    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);
    }
于 2011-11-28T01:38:31.077 に答える