Android Dev:在 UI 线程中运行 TimerTask [英] Android Dev: Run TimerTask in UI Thread

查看:30
本文介绍了Android Dev:在 UI 线程中运行 TimerTask的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试更新 TextView.

这个方法位于我的主类中,它在onCreate()中被调用;

This method is located in my Main Class and it is called in onCreate();

我尝试使用 runOnUiThread() 无济于事..

I have tried using runOnUiThread() to no avail..

一到 30 秒,它就会尝试更新 TextView,它就会崩溃!

As soon as the 30 seconds is reached and it tries to update the TextView it crashes!

感谢任何帮助:

public void updateDisplay() {
    Timer timer = new Timer();


    timer.schedule(new TimerTask() {


                       public void run() {
                           Calendar c = Calendar.getInstance();
                           int mYear = c.get(Calendar.YEAR);
                           int mMonth = c.get(Calendar.MONTH);
                           int mDay = c.get(Calendar.DAY_OF_MONTH);
                           int mHour = c.get(Calendar.HOUR_OF_DAY);
                           int mMinute = c.get(Calendar.MINUTE);

                           textView3.setText(new StringBuilder()
                                   // Month is 0 based so add 1
                                   .append(mDay).append("/")
                                   .append(mMonth + 1).append("/")
                                   .append(mYear)
                                   .append(" - ")
                                   .append(mHour)
                                   .append(":")
                                   .append(mMinute));
                       }
                   }

            ,0,30000);//Update text every 30 seconds
}

错误是:

E/AndroidRuntime: FATAL EXCEPTION: Timer-0
              Process: ggrgroup.com.workforceapp, PID: 21879
              android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                  at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7261)
                  at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1100)
                  at android.view.ViewGroup.invalidateChild(ViewGroup.java:5219)
                  at android.view.View.invalidateInternal(View.java:12900)
                  at android.view.View.invalidate(View.java:12860)
                  at android.view.View.invalidate(View.java:12844)
                  at android.widget.TextView.checkForRelayout(TextView.java:7459)
                  at android.widget.TextView.setText(TextView.java:4390)
                  at android.widget.TextView.setText(TextView.java:4247)
                  at android.widget.TextView.setText(TextView.java:4222)
                  at ggrgroup.com.workforceapp.MainActivity$1.run(MainActivity.java:77)
                  at java.util.Timer$TimerImpl.run(Timer.java:284)

推荐答案

android.view.ViewRootImpl$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能触及其视图.

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

因为你在线程中编辑 textView3

because you edit textView3 in thread

试试看:

public void updateDisplay() {定时器 timer = new Timer();

public void updateDisplay() { Timer timer = new Timer();

timer.schedule(new TimerTask(){


    public void run() {

        runOnUiThread(new Runnable(){
            @Override
            public void run() {
                Calendar c = Calendar.getInstance();
                int mYear = c.get(Calendar.YEAR);
                int mMonth = c.get(Calendar.MONTH);
                int mDay = c.get(Calendar.DAY_OF_MONTH);
                int mHour = c.get(Calendar.HOUR_OF_DAY);
                int mMinute = c.get(Calendar.MINUTE);

                textView3.setText(new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mDay).append("/")
                    .append(mMonth + 1).append("/")
                    .append(mYear)
                    .append(" - ")
                    .append(mHour)
                    .append(":")
                    .append(mMinute));
            }
        });

    }
}

, 0, 30000);//Update text every 30 seconds

}

这篇关于Android Dev:在 UI 线程中运行 TimerTask的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆