简体   繁体   中英

Error in derived TimerTask class: `Can't create handler inside thread that has not called Looper.prepare()`

I want to cyclically update an Android Layout. For this purpose I wrote a short class derived from TimerTask . Unfortunately my code causes an exception and I do not really know, what the problem might be. :(

So maybe anybody could help.

Thanks

Chris

Here's my code: In the main activity I've got:

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);
  ...
}

This is my derived TimerTask class:

public class MyReloadTimerTask  extends TimerTask
{
  private MyLayoutClass m_MyLayout;


  public MyReloadTimerTask(MyLayoutClass aLayout)
  {
    m_MyLayout = aLayout;
  }


  @Override
  public void run()
  {
    m_MyLayout.doReload();
  }
}

The doReload() cannot be executed, I get an exception with this message: Can't create handler inside thread that has not called Looper.prepare()

Timertask runs on a different thread. So you cannot not update/access ui from a background thread.

Probably m_MyLayout.doReload() is updating ui. Use a Handler or runOnUiThread

 runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            m_MyLayout.doReload()
                        }
                    });

Using 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);
                  // repeat some task every 1 second    

           }
      };
      m_handlerTask.run(); 

To cancel the run

m_handler.removeCallbacks(m_handlerTask);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM