(轉載自: http://cctg.blogspot.com/2009/06/android-multithread-viewrootcalledfromw.html )

 

Android multithread 的訊息傳遞: ViewRoot$CalledFromWrongThreadException

Activity中產生一個thread處理資料的時候,當遇到這個資料要回去更新Activity畫面上的UI元件時,會發生 android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views 這樣的錯誤。

 

這個問題弄了好久,試了幾個方法都不能處理掉,還email"Android開發範例大全"的作者(昨天寄的,現在還沒有得到回應),結果其實很簡單,是要用android.os.Handler配合android.os.Message來處理。但也許這在android開發是一般常識,不過因為我們學習的方法,並沒有從基本原理學起,而是直接看許多範例程式,才會不知道要怎麼讓ModelView互動。

 

Activity中自訂一個Handler: myViewUpdateHandler

 

Handler myViewUpdateHandler = new Handler() {

 public void handleMessage(Message msg) {

  switch (msg.what) {

   case Main.GUIUPDATEIDENTIFIER:

    // Do some GUI Stuff here

    String serverCommand = (String) msg.obj;

    processServerCommand(serverCommand);

    break;

  }

  super.handleMessage(msg);

 }

};

 

onCreate時產生的thread裡面,就可以用android.os.Message來將訊息傳遞給Activity來更新顯示元件

 Message m = new Message();

 m.what = Main.GUIUPDATEIDENTIFIER;

 m.obj = line;