根據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了,這裏就不詳細說了。
android invalidate
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.