Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Error updating TextView from TimerTask's run method

Tags:

java

android

I'm trying to test UI and Timer class possibilities. 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 UpdateTime call (from onCreate) completes OK but the same call from TimerTask::run() fails giving the message "TestTimer class has stopped unexpectedly".

Any idea? Where is my fault?

--
SY, TVT

like image 305
FILEAHOLIC Avatar asked Dec 17 '22 10:12

FILEAHOLIC


1 Answers

Do that UpateTime() operation on the UI thread.

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

Hopefully resolves your problem.

like image 88
Anup Rojekar Avatar answered Dec 26 '22 15:12

Anup Rojekar