-1

Код:TextView SetText не работает внутри ScheduledExecutorService runOnUiThread

private void startTimer() { 
    final ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1); 
    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        int count = 60; 
        time.setText(count - 1 + ""); 
        count--; 
       } 
      }); 
     } 
    }, 0 , 1000, TimeUnit.MILLISECONDS); 
} 

Я хочу, чтобы обновить текст в TextView на каждый 1 секунду, но это, кажется, работает только в первый раз, а затем текст не обновляется.

Кто-нибудь знает, в чем проблема?

+1

'Я хочу, чтобы обновить текст в TextView на каждый 1 секунду,' Почему не используется Handler.postDelayed? –

+0

Я хочу, чтобы он обновлялся каждые 1 сек в течение 60 секунд, это кажется apt –

+0

проверить пример http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html – Madhur

ответ

3
int count = 60; 
private void startTimer() { 
final ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(1); 
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
    @Override 
    public void run() { 
     runOnUiThread(new Runnable() { 
      public void run() { 
      if(count > 0){ 
       time.setText(count - 1 + ""); 
       count--; 
      } 
      } 
     }); 
    } 
    }, 0 , 1000, TimeUnit.MILLISECONDS); 
} 
+0

@downvoter Выше кода работает отлично, можете ли вы рассказать о причине downvote. –

+0

это сработало, спасибо, чувак –

+0

Ваш прием :) @Logic –

1

Read How to run a Runnable thread in Android

Вы можете использовать Handler

обработчик позволяет передавать и обрабатывать сообщения и Runnable объектов , связанные с MessageQueue потока. Каждый экземпляр Handler имеет значение , связанное с одним потоком и очереди сообщений этого потока. Когда вы создаете нового обработчика, он привязан к очереди потоков/сообщений потока, который его создает - с этой точки он доставляет сообщениям и запускам в эту очередь сообщений и выполняет их по мере их появления из очереди сообщений.

Вам необходимо использовать метод handler.postDelayed(new Runnable().

Вызывает Runnable г, которые будут добавлены в очередь сообщений, чтобы запустить по истечении заданного промежутка времени истечет. Прогон будет запущен в потоке, к которому прикреплен этот обработчик.

Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
     // Add your code Here 

     handler.postDelayed(this, 1000); // You can change your time 
     } 
    }, 900); 
Смежные вопросы