原創文章轉載須留下
http://www.3geye.net/?3/viewspace-2925 鏈接
根據Android SDK api文檔說明
invalidate 方法是用來更新視圖(View)的方法,不過這東西的用法比較古怪
invalidate 方法如果你直接在主線程中調用,是看不到任何更新的。
如果跟線程結合使用的話
比如在下面的代碼中就會拋出異常
UIThread implements Runnable{
public void run(){
invalidate();
}
}
上面的代碼會拋出Only the original thread that created a view hierarchy can touch its views。
怎么樣解決上面的問題呢,如果你有兩個View,你需要一個View用來顯示當前的狀態,一個Thread去下載網絡數據
或者是讀取文件等,這些數據讀取完畢后你要更新View到當前屏幕上怎么辦呢。看看下面的代碼,也許可以幫助你
第一種解決方案是:
class UIUpdateThread implements Runnable{
public void run() {
try {
Thread.sleep(1000*5);
mHandler.post(mUpdateResults);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
final Handler mHandler = new Handler();
final Runnable mUpdateResults = new Runnable() {
public void run() {
invalidate(); //更新視圖
}
};
}
你必須實現一個Handler.然后再你下載數據的線程中放上一個mHandler.post(mUpdateResults);這樣就可以了。
第2中方案比較簡單
LoadDataThread implements Runnable{
public void run(){
doLoadData();
mHandler.sendMessage(mHandler.obtainMessage()); //這里系統會自動調用handleMessage;這樣就可以更新視圖了
}
}
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 這里處理視圖需要更新的代碼。
}
};
總結,發現Google Android 好像有點弱智了。Api這么難用,不如J2ME簡單啊。
對于postInvalidate用法來說就相對簡單點了直接調用就OK了,這里就不詳細說了。