2013-10-10 24 views
1

我想循環更新Android佈局。爲此,我編寫了一個從TimerTask派生的簡短課程。 不幸的是,我的代碼導致了一個異常,我真的不知道,問題可能是什麼。 :(派生的TimerTask類中的錯誤:`不能在未調用Looper.prepare()的線程內創建處理程序`

因此,也許有人可以幫助

感謝

克里斯

這裏是我的代碼: 在主要活動我有:

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()不能被執行,我得到一個異常此消息:Can't create handler inside thread that has not called Looper.prepare()

+0

的TimerTask在不同的線程中運行。所以你不能從後臺線程更新/訪問ui。 'doReaload()'做了什麼 – Raghunandan

回答

4

的TimerTask運行在不同的線程。所以你不能從後臺線程更新/訪問ui。

很可能m_MyLayout.doReload()正在更新ui。使用HandlerrunOnUiThread

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); 
相關問題