首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在安卓系统中从后台线程使用CountDownTimer

在安卓系统中从后台线程使用CountDownTimer
EN

Stack Overflow用户
提问于 2014-12-03 15:14:11
回答 4查看 2.9K关注 0票数 1

我想使用CountDownTimer从后台线程更新UI线程中的文本,该线程只计算剩余时间。

我继承了一个线程,并在其构造函数中传递了主线程处理程序,并在CountDownTimer方法中创建了一个新的run方法来更新主ui线程中的文本视图,如下所示:

代码语言:javascript
复制
class MyCounter extends Thread
{
   private Handler uiHandler;
   private long timeToCount;

   public MyCounter(Handler handler, long time)
   {
     this.uiHandler = handler;
     this.timeToCount = time;
   }

public void run()
{
  new CountDownTimer(timeToCount, 1000){
       public void onTick(long millisUntilFinished) {
           Message msg =  Message.obtain();
           String timeString = //....here I conver millisUntilFinished to String format
           msg.obj = timeString;
           uiHandler.sendMessage(msg);
       }

      .... //Other method of CountDownTimer
     }.start();
  } //end of run
} //end of thread class

我创建了MyCounter线程,并在我的活动UI (主线程)上调用start,传递一个在主线程中创建的处理程序。在我的主活动中调用start后,CountDownTimer似乎没有被调用。

有什么想法吗?

EN

回答 4

Stack Overflow用户

发布于 2014-12-03 15:26:21

我认为为了更新活动中的文本视图,你必须使用runOnUiThread,例如:

代码语言:javascript
复制
        runOnUiThread(new Runnable() {
          @Override
          public void run() {


                    textview1.setText(content);

        });
票数 3
EN

Stack Overflow用户

发布于 2014-12-03 15:33:20

我认为对于这种典型的情况,即以固定的时间间隔运行一些东西,计时器更合适。下面是一个简单的例子:

代码语言:javascript
复制
myTimer = new Timer();
myTimer.schedule(new TimerTask() {          
@Override
public void run() {
        // If you want to modify a view in your Activity
         MyActivity.this.runOnUiThread(new Runnable()
         public void run(){
              tv.append("Hello World");
         }  
       );
}
}, 1000, 1000); // initial delay 1 second, interval 1 second

使用计时器有几个优点:初始延迟和间隔可以很容易地在调度函数参数中指定计时器可以通过简单地调用myTimer.cancel()来停止计时器如果只想让一个线程运行,请记住在调度新线程之前调用myTimer.cancel() (如果myTimer不为空)

票数 0
EN

Stack Overflow用户

发布于 2014-12-03 15:36:27

代码语言:javascript
复制
new CountDownTimer(timeToCount, 1000){
    public void onTick(long millisUntilFinished) {
        runOnUiThread(new Runnable() {
            public void run()
            {
                Message msg =  Message.obtain();
                String timeString = //....here I conver millisUntilFinished to String format
                msg.obj = timeString;
                uiHandler.sendMessage(msg);
            }
       });
    }  
}.start();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27265760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档