从TimerTask的run方法更新TextView时出错

时间:2011-08-10 12:42:30

标签: java android

我正在尝试测试UI和Timer类的可能性。所以我尝试了以下练习:

=== 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 ===

第一次UpdateTime调用(来自onCreate)完成OK但来自TimerTask :: run()的同一调用失败,并显示消息“TestTimer类已意外停止”。

有什么想法吗?我的错在哪里?

-
SY,TVT

2 个答案:

答案 0 :(得分:11)

在UI线程上执行UpateTime()操作。

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

希望能解决你的问题。

答案 1 :(得分:1)

从UI /主线程以外的线程更新UI将失败,因为Android不允许它。尝试使用Handler将消息发布回UI线程。

或者也许尝试使用AsyncTask,它提供了一组非常简单的回调方法来处理worker和UI线程。但是,由于您试图测试TimerTask类,这可能不是您所需要的。