Error updating TextView from TimerTask startup method

I am trying to test the capabilities of the interface and the timer. So I tried the following exercise:

=== TestTimerActivity.java ===

package com.tvt.TestTimer; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import java.util.Timer; import java.util.TimerTask; public class TestTimerActivity extends Activity { TextView _tv; Timer _t; int _count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // // _tv = (TextView) getWindow().getDecorView().findViewById( R.id.TextViewTime ); _tv = (TextView) findViewById( R.id.TextViewTime ); UpdateTime(); // Completes OK _t = new Timer(); _t.scheduleAtFixedRate( new TimerTask() { @Override public void run() { // TODO Auto-generated method stub _count++; UpdateTime(); // Fails } }, 1000, 1000 ); } protected void UpdateTime() { _tv.setText( "" + _count ); } } 

=== TestTimerActivity.java ===

=== main.xml ===

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:gravity="center_horizontal" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/header" android:id="@+id/TestViewHeader" android:textStyle="bold"/> <TextView android:layout_height="wrap_content" android:id="@+id/TextViewTime" android:layout_width="match_parent" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:text="-"></TextView> </LinearLayout> 

=== main.xml ===

The very first call to UpdateTime (from onCreate) completes OK, but the same call from TimerTask :: run () does not give the message "TestTimer class stopped unexpectedly."

Any idea? Where is my fault?

-
SY, TVT

+4
source share
2 answers

Do the UpateTime () operation on the user interface thread.

 protected void UpdateTime() { runOnUiThread(new Runnable() { public void run() { _tv.setText( "" + _count ); } }); } 

Hope you solve your problem.

+11
source

Updating the user interface from a thread other than the UI / main thread will fail because Android does not allow it. Try using Handler to send messages back to the user interface stream.

Or try using AsyncTask , which introduces a set of really simple callback methods to handle worker threads and the user interface. But this may not be exactly what you need, as you are trying to test the TimerTask class.

+1
source

All Articles