Обновление TextView каждые N секунд? - PullRequest
3 голосов
/ 24 января 2011

В последнее время я очень смущен этим и нигде не могу найти ответ.

При программировании для Android я хочу обновлять текстовое представление каждые 10 секунд, но как мне это сделать? Я видел, как некоторые примеры используют «Run ()» и «Update ()», но, кажется, это не помогает, когда я пытаюсь это сделать, какие-либо идеи?

Прямо сейчас у меня есть:

</p>

<code>public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.slideshow);

  CONST_TIME = (int) System.currentTimeMillis();

  Resources res = getResources();        
  myString = res.getStringArray(R.array.myArray);
}

public void checkTime(View V){
 TextView text = (TextView) findViewById(R.id.fadequote);
 CUR_TIME = (int) System.currentTimeMillis();
 text.setText(""+(int) (CUR_TIME-CONST_TIME));//Debugs how much time has gone by

 if(CUR_TIME-CONST_TIME>10000){
  getNextQuote(null); //A function that gets a random quote
  CONST_TIME = CUR_TIME;
 }
}
</code>

Я предполагаю, что я ДЕЙСТВИТЕЛЬНО спрашиваю, как я могу заставить checkTime () повторять его бесконечно, пока не вызывается onPause ()?

Ответы [ 5 ]

15 голосов
/ 24 января 2011

Вместо суеты с фоновым потоком, а затем runOnUiThread(), используйте postDelayed(), доступный на любом View, чтобы запланировать Runnable. Это Runnable может обновить ваш TextView и затем запланировать себя для следующего прохода. Использование фонового потока для наблюдения за временем - пустая трата времени.

10 голосов
/ 24 января 2011

Как насчет использования таймера?

private Timer timer = new Timer();
private TimerTask timerTask;
timerTask = new TimerTask() {
 @Override
 public void run() {
    //refresh your textview
 }
};
timer.schedule(timerTask, 0, 10000);

Отмените его через timer.cancel (). В вашем методе run () вы можете использовать runOnUiThread ();

UPDATE:

У меня есть приложение livescoring, которое использует этот таймер для обновления каждые 30 секунд. Это выглядит так:

private Timer timer;
private TimerTask timerTask;

public void onPause(){
    super.onPause();
    timer.cancel();
}

public void onResume(){
    super.onResume();
    try {
       timer = new Timer();
       timerTask = new TimerTask() {
          @Override
          public void run() {
         //Download file here and refresh
          }
       };
    timer.schedule(timerTask, 30000, 30000);
    } catch (IllegalStateException e){
       android.util.Log.i("Damn", "resume error");
    }
}
8 голосов
/ 07 ноября 2014

Я согласен с ответом Wired00, но, пожалуйста, следуйте этому порядку:

        //update current time view after every 1 seconds
        final Handler handler=new Handler();

        final Runnable updateTask=new Runnable() {
            @Override
            public void run() {
                updateCurrentTime();
                handler.postDelayed(this,1000);
            }
        };

        handler.postDelayed(updateTask,1000);
5 голосов
/ 14 августа 2012

, если это кому-то поможет, вот пример кода, использующего postDelayed()

...

private Handler mHandler = new Handler();

...

// call updateTask after 10seconds
mHandler.postDelayed(updateTask, 10000);

...

private Runnable updateTask = new Runnable () {
    public void run() {
        Log.d(getString(R.string.app_name) + " ChatList.updateTask()",
                "updateTask run!");

                    // run any code here...         

                    // queue the task to run again in 15 seconds...
                    mHandler.postDelayed(updateTask, 15000);


    }
};
0 голосов
/ 24 января 2011

Использовать тему. См. Безболезненная резьба .

...