android invalidate

 根據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了,這裏就不詳細說了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章