Java 派生的TimerTask类中出错:`Can';t在未调用Looper.prepare()的线程内创建处理程序`
我想周期性地更新Android布局。为此,我编写了一个从Java 派生的TimerTask类中出错:`Can';t在未调用Looper.prepare()的线程内创建处理程序`,java,android,multithreading,timertask,Java,Android,Multithreading,Timertask,我想周期性地更新Android布局。为此,我编写了一个从TimerTask派生的短类。 不幸的是,我的代码导致了一个异常,我真的不知道问题可能是什么:( 所以也许任何人都可以帮忙 谢谢 克里斯 这是我的密码: 在我的主要活动中: private MyLayoutClass m_MyLayout; ... public void onCreate(Bundle savedInstanceState) { ... m_MyLayout = new AdLayout(this); T
TimerTask
派生的短类。
不幸的是,我的代码导致了一个异常,我真的不知道问题可能是什么:(
所以也许任何人都可以帮忙
谢谢
克里斯
这是我的密码:
在我的主要活动中:
private MyLayoutClass m_MyLayout;
...
public void onCreate(Bundle savedInstanceState)
{
...
m_MyLayout = new AdLayout(this);
Timer caretaker = new Timer();
caretaker.schedule(new MyReloadTimerTask(m_MyLayout), 1000, 5000);
...
}
这是我的派生TimerTask类:
public class MyReloadTimerTask extends TimerTask
{
private MyLayoutClass m_MyLayout;
public MyReloadTimerTask(MyLayoutClass aLayout)
{
m_MyLayout = aLayout;
}
@Override
public void run()
{
m_MyLayout.doReload();
}
}
无法执行doReload(),我收到一条异常消息:
无法在未调用Looper的线程内创建处理程序。prepare()
Timertask在其他线程上运行。因此,您无法从后台线程更新/访问ui
可能m_MyLayout.doReload()
正在更新ui。请使用处理程序或runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
m_MyLayout.doReload()
}
});
使用处理程序
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);
// repeat some task every 1 second
}
};
m_handlerTask.run();
取消跑步
m_handler.removeCallbacks(m_handlerTask);
Timertask在不同的线程上运行。因此您不能从后台线程更新/访问ui
可能m_MyLayout.doReload()
正在更新ui。请使用处理程序或runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
m_MyLayout.doReload()
}
});
使用处理程序
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);
// repeat some task every 1 second
}
};
m_handlerTask.run();
取消跑步
m_handler.removeCallbacks(m_handlerTask);
Timertask运行在不同的线程上。因此,您不能从后台线程更新/访问ui。doReaload()
doTimertask运行在不同的线程上。因此,您不能从后台线程更新/访问ui。doReaload()
做什么