Java 派生的TimerTask类中出错:`Can';t在未调用Looper.prepare()的线程内创建处理程序`

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

我想周期性地更新Android布局。为此,我编写了一个从
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()
做什么