user1744228
user1744228

Reputation: 153

Displaying a stopwatch in an android app in a textView

I have setup a stop watch using the com.apache.commons library and the stop watch seems to work fine. What I don't know how to do is display this stopwatch in a textView in my app. In general, I have no idea how that would work, i.e. How exactly would a stopwatch be displayed in a textView, given that the time on a stopwatch keeps changing constantly? At the moment, I have the code below and it updated the text in the textView every second for about 2 seconds and then I got a weird error. I'm not even sure if this is the right way to go about doing this. Please help!

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

The error I got after 2 seconds (and it successfully updated the time) was :

"only the original thread that created a view hierarchy can touch its views"

Upvotes: 1

Views: 1464

Answers (2)

crocboy
crocboy

Reputation: 2897

You can only update a TextView on the UI thread.

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

//stuff that updates ui

    }
});

Your code becomes

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

You may have to do myActivityObject.runOnUiThread() if you're getting an error there.

See this for more detail.

Upvotes: 4

Prem
Prem

Reputation: 4821

To update a view from another thread, you should use 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();
    }

Upvotes: 0

Related Questions