android 網絡編程的一些解決方案

根據Android SDK api文檔說明
invalidate 方法是用來更新視圖(View)的方法,不過這東西的用法比較古怪
invalidate 方法如果你直接在主線程中調用,是看不到任何更新的。
如果跟線程結合使用的話
比如在下面的代碼中就會拋出異常
1.UIThread implements Runnable{
2.public void run(){
3.  invalidate();
4.  }
5.}
上面的代碼會拋出Only the original thread that created a view hierarchy can touch its views。
怎麼樣解決上面的問題呢,如果你有兩個View,你需要一個View用來顯示當前的狀態,一個Thread去下載網絡數據
或者是讀取文件等,這些數據讀取完畢後你要更新View到當前屏幕上怎麼辦呢。看看下面的代碼,也許可以幫助你
第一種解決方案是:
01.class UIUpdateThread implements Runnable{
02.            public void run() {
03.                try {
04.                    Thread.sleep(1000*5);
05.                    mHandler.post(mUpdateResults);
06.                } catch (InterruptedException e) {
07.                    e.printStackTrace();
08.                }
09.                  
10.            }
11.              
12.             final Handler mHandler = new Handler();
13.                final Runnable mUpdateResults = new Runnable() {
14.                    public void run() {
15.                        invalidate(); //更新視圖
16.                    }
17.                };
18.              
19.}
你必須實現一個Handler.然後再你下載數據的線程中放上一個mHandler.post(mUpdateResults);這樣就可以了。
第2中方案比較簡單
01.LoadDataThread implements Runnable{
02.public void run(){
03.   doLoadData();
04.   mHandler.sendMessage(mHandler.obtainMessage()); //這裏系統會自動調用handleMessage;這樣就可以更新視圖了
05.   }
06.}
07.  Handler mHandler = new Handler(){
08.        @Override
09.        public void handleMessage(Message msg) {
10.            super.handleMessage(msg);
11.            // 這裏處理視圖需要更新的代碼。
12.                      
13.        }
14.   };
總結,發現Google Android 好像有點弱智了。Api這麼難用,不如J2ME簡單啊。
   
   
對於postInvalidate用法來說就相對簡單點了直接調用就OK了,這裏就不詳細說了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章