我正在开发一个基于测验的应用程序,并且在此尝试在一段延迟时间之后尝试跳转某些方法,但不幸的是我得到了一些运行时错误.. 这是代码..
new Timer().schedule(new TimerTask() {
@Override
public void run()
{
resetcolor();
nextpage();
rg.clearCheck();
showdata();
}
}, 6000);
这是我的Log cat Error ..
09-12 12:11:06.775: W/dalvikvm(489): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
09-12 12:11:06.789: E/AndroidRuntime(489): FATAL EXCEPTION: Timer-0
09-12 12:11:06.789: E/AndroidRuntime(489): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.View.invalidate(View.java:5115)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.TextView.invalidateDrawable(TextView.java:3796)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:97)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.Drawable.setState(Drawable.java:400)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.CompoundButton.drawableStateChanged(CompoundButton.java:271)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.View.refreshDrawableState(View.java:7248)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.CompoundButton.setChecked(CompoundButton.java:115)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.setCheckedStateForView(RadioGroup.java:179)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.check(RadioGroup.java:159)
09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.clearCheck(RadioGroup.java:205)
09-12 12:11:06.789: E/AndroidRuntime(489): at com.example.quizapp.Firstques$1$1.run(Firstques.java:234)
09-12 12:11:06.789: E/AndroidRuntime(489): at java.util.Timer$TimerImpl.run(Timer.java:289)
答案 0 :(得分:1)
TimerTask在不同的线程上运行。 Ui应该在ui线程上更新或访问。所以请使用runOnUiThread
在timertask run方法中
new Timer().schedule(new TimerTask() {
@Override
public void run()
{
runOnUiThread(new Runnable() {
@Override
public void run() {
resetcolor();
nextpage();
rg.clearCheck();
showdata();
}
});
}
}, 6000);
或使用处理程序
Handler m_handler;
Runnable m_handlerTask ;
handler= new Handler()
m_handlerTask = new Runnable()
{
@Override
public void run() {
// do something
resetcolor();
nextpage();
rg.clearCheck();
showdata()
m_handler.postDelayed(m_handlerTask, 6000);
}
};
m_handlerTask.run();
停止处理程序m_handler.removeCallbacks(m_handlerTask)
答案 1 :(得分:1)
重写您的代码如下:
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(6000);
runOnUiThread(new Runnable() {
@Override
public void run() {
resetcolor();
nextpage();
rg.clearCheck();
showdata();
}
});
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}).start();
您的问题是您无法从后台线程触摸UI元素。上面的代码执行主线程中的UI更改(也称为“UI线程”)。