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