在textView中的Android应用程序中显示秒表

时间:2014-07-23 14:49:38

标签: android

我使用com.apache.commons库设置了秒表,秒表似乎工作正常。我不知道怎么做是在我的应用程序的textView中显示这个秒表。一般来说,我不知道它会如何工作,即如果秒表上的时间不断变化,那么秒表在textView中的显示效果如何呢?目前,我有下面的代码,它每秒更新textView中的文本大约2秒,然后我得到一个奇怪的错误。我甚至不确定这是否是正确的方法。请帮忙!

        Timer timer = new Timer();
        TimerTask timerTask;
        timerTask = new TimerTask() {
         @Override
         public void run() {
            timeText.setText(time.toString());
         }
        };
        timer.schedule(timerTask, 0, 1000);

我在2秒后得到的错误(并且它成功更新了时间)是:

“只有创建视图层次结构的原始线程才能触及其视图”

2 个答案:

答案 0 :(得分:3)

您只能在UI线程上更新TextView

runOnUiThread(new Runnable() {
     @Override
     public void run() {

//stuff that updates ui

    }
});

您的代码变为

Timer timer = new Timer();
TimerTask timerTask;
timerTask = new TimerTask() 
{
   @Override
   public void run() 
   {
      runOnUiThread(new Runnable() 
      {
        @Override
        public void run() 
        {
          timeText.setText(time.toString());
        }
      });  
   }
};

timer.schedule(timerTask, 0, 1000);

如果您在那里收到错误,则可能需要myActivityObject.runOnUiThread()

有关详细信息,请参阅this

答案 1 :(得分:0)

要从另一个线程更新视图,您应该使用handler。

private void startTimerThread() {
    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        private long startTime = System.currentTimeMillis();
        public void run() {
//Change the condition for while loop depending on your program logic
                while (true) {  
                    try {
                        Thread.sleep(1000);
                    }    
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.post(new Runnable(){
                        public void run() {
                          timeText.setText(time.toString());
                    }
                });
                }
            }
        };
        new Thread(runnable).start();
    }