2009/6/6

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開發是一般常識,不過因為我們學習的方法,並沒有從基本原理學起,而是直接看許多範例程式,才會不知道要怎麼讓Model跟View互動。

在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;