Android Dev:在 UI 线程中运行 TimerTask [英] Android Dev: Run TimerTask in UI Thread
问题描述
我正在尝试更新 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屋!