我正在尝试测试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
答案 0 :(得分:11)
在UI线程上执行UpateTime()操作。
protected void UpdateTime()
{
runOnUiThread(new Runnable()
{
public void run()
{
_tv.setText( "" + _count );
}
});
}
希望能解决你的问题。
答案 1 :(得分:1)