2010-05-12 99 views
2

解決CalledFromWrongThreadException我會盡量保持簡單:無法與處理程序

在我的主要活動我作出處理:

public class ARViewer extends ARDisplayActivity { 

    public final MHandler mHandler = new MHandler(this); 

public void onCreate(Bundle savedInstanceState) { 
... 

類MHandler:

public final class MHandler extends Handler{ 

     //main activity 
private ARViewer arnv; 

     public MHandler(ARViewer arnv){ 
    this.arnv = arnv; 
} 

     @Override 
public void handleMessage(Message msg) { 
      ... 
      case H_RR : 
        arnv.setContentView(R.layout.routeplanner);  
        break; 
      ... 
    super.handleMessage(msg); 
} 
} 

但如果我從另一個類的回調函數中調用handleMessage方法,肯定是從另一個線程調用的,我仍然會收到異常消息:CalledFromWrongThreadException (Only the original thread that created a view hierarchy can touch its views)

public void rFound(Route route) { 
      Message msg = new Message(); 
      msg.what = MHandler.H_RR; 
      ARViewer.arnv.mHandler.handleMessage(msg); 
} 

回答

3

您不需要參考那裏的活動。 創建新的可運行的地方,你做你的UI的東西。並做mHandler.post(myUIRunnable); 示例如下: http://developer.android.com/guide/appendix/faq/commontasks.html#threading

+0

我發現此解決方案之前,但無法使其工作。我會再看看它。謝謝 – Michel 2010-05-12 13:15:18

+0

爲什麼你要在線程中設置setContentView(R.layout.routeplanner)?將它設置在onCreate中,然後通過findViewById(R.id.myview)更新你的視圖/佈局,並設置正確的內容/值/可見性 – 2010-05-12 13:39:01

+0

還有比'routeplanner'更多的視圖(組),所以我想要一個處理程序所有視圖 – Michel 2010-05-12 13:45:41

0

您應該爲Handler調用sendMessage(),消息標識爲H_RR。這將自動調用主線程中的handleMessage()。

相關問題