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

在textView中的android应用程序中显示秒表,android,Android,我使用com.apache.commons库设置了秒表,秒表似乎工作正常。我不知道如何在我的应用程序的文本视图中显示这个秒表。一般来说,我不知道这将如何工作,也就是说,如果秒表上的时间不断变化,那么秒表将如何准确地显示在文本视图中?目前,我有下面的代码,它每秒更新一次textView中的文本,持续了大约2秒钟,然后我得到了一个奇怪的错误。我甚至不确定这样做是否正确。请帮忙 Timer timer = new Timer(); TimerTask timerTask

我使用com.apache.commons库设置了秒表,秒表似乎工作正常。我不知道如何在我的应用程序的文本视图中显示这个秒表。一般来说,我不知道这将如何工作,也就是说,如果秒表上的时间不断变化,那么秒表将如何准确地显示在文本视图中?目前,我有下面的代码,它每秒更新一次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秒后得到的错误(它成功地更新了时间)是:


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

您只能在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()


有关更多详细信息,请参阅。

您只能在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()


有关详细信息,请参阅。

要从另一个线程更新视图,应使用处理程序

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

要从另一个线程更新视图,应使用处理程序

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

发生此错误之前它运行了多长时间?您无法通过线程访问UI组件。使用
UIThread
而不是在发生此错误之前它运行了多长时间?您无法通过线程访问UI组件。改用
UIThread