Android简单定时器/计时器任务问题

4

我想在安卓上实现一个基本的计时器,我在onCreate()方法中写下了以下代码:

    editText = (EditText) findViewById(R.id.edit_message);
    Timer time = new Timer();     

    time.schedule(new TimerTask() {
        public void run() {
            timesince++;
            editText.setText("Timeran:"+timesince);
            Log.d("TIMER", "TimerTask run");
        }}, 0, 1000);

希望它能更新文本框,显示一个递增的值(timesince),该值在程序顶部声明,以及editText...。然而,尽管没有编译问题,但当我在模拟器上运行它时,它根本不起作用。应用程序显示“blahblahblah已停止工作...”。我是不是错过了计时器的使用方法?我漏掉了什么?非常感谢。(备注:如果删除此代码,则应用程序可以正常工作,因此我知道这部分存在问题。)编辑:我认为这是我的logcat输出,对于这堵墙般的文本,我很抱歉:
10-11 03:40:49.260: E/AndroidRuntime(561): FATAL EXCEPTION: Timer-0
10-11 03:40:49.260: E/AndroidRuntime(561): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:3939)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:714)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:763)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:4012)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.view.View.invalidate(View.java:8454)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.invalidateCursor(TextView.java:4319)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.spanChange(TextView.java:7670)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:8020)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:898)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:614)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:520)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.Selection.setSelection(Selection.java:76)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.Selection.setSelection(Selection.java:87)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3244)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3110)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.EditText.setText(EditText.java:78)
10-11 03:40:49.260: E/AndroidRuntime(561):  at android.widget.TextView.setText(TextView.java:3085)
10-11 03:40:49.260: E/AndroidRuntime(561):  at com.example.cultivation.MainActivity$1.run(MainActivity.java:54)
10-11 03:40:49.260: E/AndroidRuntime(561):  at java.util.Timer$TimerImpl.run(Timer.java:284)
4个回答

3
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

这是问题

你需要将更新UI的后台任务部分移到主线程上,或在UI线程中创建mHandler;

更新:

从计时器更新UI:http://android-developers.blogspot.com/2007/11/stitch-in-time.html


对不起,我真的不知道那是什么意思;我以为我的main.java文件中的onCreate()方法应该是主线程的一部分?-那我应该把这个计时器代码放在哪里呢? - James Andrew

2
或者使用处理程序来更新TextView:
     private final Runnable mRunnable1 = new Runnable() {

     public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");

 mHandler.postDelayed(mRunnable1, 1000);
 }

 };

并且在 OnCreate() 方法中调用这行代码 mHandler.postDelayed(mRunnable1, 1000);


0
做以下操作:
声明Timer为全局变量,并在方法中调用计时器函数,如下所示:
   public void startThread(){
    time.schedule(new TimerTask() {
    public void run() {
        timesince++;
        editText.setText("Timeran:"+timesince);
        Log.d("TIMER", "TimerTask run");
    }}, 0, 1000);
    }

并在 onCreate() 中调用此 startThread() 函数


0
尝试从UI线程更新TextView。尝试使用处理程序。您可以在此处找到一篇关于此的好文章。使用Handler更新textview

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接