【问题标题】:TextView setText not working inside ScheduledExecutorService runOnUiThreadTextView setText 在 ScheduledExecutorService runOnUiThread 中不起作用
【发布时间】:2016-01-29 05:50:22
【问题描述】:

代码:

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

我想每 1 秒更新一次 TextView 中的文本,但这似乎只适用于第一次,以后的文本不会更新。

有人知道这是什么问题吗??

【问题讨论】:

  • I want to update text in TextView for every 1 second, 为什么不使用 Handler.postDelayed ?
  • 我希望它每 1 秒更新 60 秒,这似乎很合适
  • 你可以查看我的答案:)
  • 对不起,我的坏人,我给了 int count = 60;内部运行所以它总是显示 59

标签: android textview scheduledexecutorservice android-runonuithread


【解决方案1】:
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);
}

【讨论】:

  • @downvoter 上面的代码运行良好,您能告诉我拒绝投票的原因吗?
【解决方案2】:

阅读How to run a Runnable thread in Android

你可以使用处理程序

处理程序允许您发送和处理 Message 和 Runnable 对象 与线程的 MessageQueue 相关联。每个 Handler 实例都是 与单个线程和该线程的消息队列相关联。什么时候 你新建一个Handler,它绑定到线程/消息队列 正在创建它的线程——从那时起,它将传递 消息和可运行的消息到该消息队列并执行它们 从消息队列中出来。

你需要使用handler.postDelayed(new Runnable()方法。

使 Runnable r 被添加到消息队列中,以便运行 经过指定的时间后。可运行的将运行 在附加此处理程序的线程上。

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

【讨论】:

  • 我已经搜索了很长时间,这是我能找到的唯一可行的解​​决方案。
  • @iTadreik 很高兴听到!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多