本文介绍了定时器/ TimerTask的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我刚开始的Android应用程序编程及现在我有一个定时器和定时器任务出现了问题。
在我的应用我用一个定时器来更新UI,但是当我开始测试它得到一个错误,我必须强迫关闭它。
下面是我的定时器code:
INT延迟= 5000; // 5秒的延迟。
INT周期= 1000; //重复每秒。定时器定时器=新的Timer();
timer.scheduleAtFixedRate(新的TimerTask()
{
公共无效的run()
{
moveLettersInCircle(); }},延迟期);
LogCat中这样说:
07-30 18:40:12.635:D / dalvikvm(334):GC_EXTERNAL_ALLOC释放61K,52%免费2599K / 5379K,1625K外部/ 2137K,暂停52ms
07-30 18:40:16.186:D / dalvikvm(334):GC_EXTERNAL_ALLOC释放36K,51%免费2672K / 5379K,3792K外部/ 4025K,暂停40毫秒
07-30 18:40:21.503:W / dalvikvm(334):主题ID = 9:螺纹未捕获的异常(组= 0x40015560)退出
07-30 18:40:21.526:E / AndroidRuntime(334):致命异常:定时器0
07-30 18:40:21.526:E / AndroidRuntime(334):$ android.view.ViewRoot CalledFromWrongThreadException:只有创建视图层次可以触摸其观点原来的线程。
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.ViewRoot.checkThread(ViewRoot.java:2932)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.requestLayout(View.java:8267)
07-30 18:40:21.526:E / AndroidRuntime(334):在android.view.View.setLayoutParams(View.java:5000)
07-30 18:40:21.526:E / AndroidRuntime(334):在com.jest.womix.Game $ 1.run(Game.java:104)
07-30 18:40:21.526:E / AndroidRuntime(334):在java.util.Timer中的$ TimerImpl.run(Timer.java:284)
07-30 18:40:25.666:I /流程(334):发送信号。 PID:334 SIG:9
我该如何解决呢?
编辑HANDLER code:
处理程序m_handler;
可运行m_handlerTask;
m_handler =新的处理程序();
m_handlerTask =新的Runnable()
{
@覆盖
公共无效的run(){ moveLettersInCircle();
m_handler.postDelayed(m_handlerTask,1000); //问题:局部变量m_handlerTask可能没有被初始化 - >但是,如果我将其初始化然后我得到了行m_handlerTask =新的Runnable其他错误() }
};
m_handlerTask.run();
最好的问候
解决方案
我猜你是从backgroudn线程更新界面。定时器运行在不同的线程。
您应该更新UI线程UI。使用 runOnUiThread
runOnUiThread(新的Runnable(){ @覆盖
公共无效的run(){
//这里更新UI。
}
});
The above generally means you are updaint/acessing ui from another thread.
You can also use a Handler
Handler m_handler;
Runnable m_handlerTask ;
m_handler = new Handler();
m_handlerTask = new Runnable()
{
@Override
public void run() {
// do something
m_handler.postDelayed(m_handlerTask, 1000);
}
};
m_handlerTask.run();
To cancel the run m_handler.removeCallbacks(m_handlerTask)
.
Edit:
timer.scheduleAtFixedRate( new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() //run on ui thread
{
public void run()
{
// update ui here
}
});
}
}, 1000, 1000 );
这篇关于定时器/ TimerTask的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!