饒榮慶 -- 您今天UCWEB了嗎?--http://www.ucweb.com

          3G 手機(jī)開發(fā)網(wǎng)

             :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            99 Posts :: 1 Stories :: 219 Comments :: 0 Trackbacks
          原創(chuàng)文章轉(zhuǎn)載須留下
          http://www.3geye.net/?3/viewspace-2925 鏈接


          根據(jù)Android SDK api文檔說(shuō)明
          invalidate 方法是用來(lái)更新視圖(View)的方法,不過這東西的用法比較古怪
          invalidate 方法如果你直接在主線程中調(diào)用,是看不到任何更新的。
          如果跟線程結(jié)合使用的話
          比如在下面的代碼中就會(huì)拋出異常

          UIThread implements Runnable{
          public void run(){
            invalidate();
            }
          }
          上面的代碼會(huì)拋出Only the original thread that created a view hierarchy can touch its views。
          怎么樣解決上面的問題呢,如果你有兩個(gè)View,你需要一個(gè)View用來(lái)顯示當(dāng)前的狀態(tài),一個(gè)Thread去下載網(wǎng)絡(luò)數(shù)據(jù)
          或者是讀取文件等,這些數(shù)據(jù)讀取完畢后你要更新View到當(dāng)前屏幕上怎么辦呢。看看下面的代碼,也許可以幫助你

          第一種解決方案是:
          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(); //更新視圖
                              }
                          };
                     
          }
          你必須實(shí)現(xiàn)一個(gè)Handler.然后再你下載數(shù)據(jù)的線程中放上一個(gè)mHandler.post(mUpdateResults);這樣就可以了。

          第2中方案比較簡(jiǎn)單

          LoadDataThread implements Runnable{
          public void run(){
             doLoadData();
             mHandler.sendMessage(mHandler.obtainMessage()); //這里系統(tǒng)會(huì)自動(dòng)調(diào)用handleMessage;這樣就可以更新視圖了
             }
          }

            Handler mHandler = new Handler(){
                  @Override
                  public void handleMessage(Message msg) {
                      super.handleMessage(msg);
                      // 這里處理視圖需要更新的代碼。
                             
                  }
             };
            
             總結(jié),發(fā)現(xiàn)Google Android 好像有點(diǎn)弱智了。Api這么難用,不如J2ME簡(jiǎn)單啊。
            
            
           對(duì)于postInvalidate用法來(lái)說(shuō)就相對(duì)簡(jiǎn)單點(diǎn)了直接調(diào)用就OK了,這里就不詳細(xì)說(shuō)了。
            

          爬蟲工作室 -- 專業(yè)的手機(jī)軟件開發(fā)工作室
          3G視線 -- 專注手機(jī)軟件開發(fā)
          posted on 2008-03-05 16:13 3G工作室 閱讀(7202) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: Android invalidate 與postInvalidate用法 2008-03-05 22:06 魔域私服
          http://www.zhaomysf.com.cn  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 文登市| 蓬溪县| 临沂市| 潼南县| 玛纳斯县| 武汉市| 城口县| 江北区| 建始县| 蕉岭县| 宣汉县| 宿松县| 东乡族自治县| 浏阳市| 阿鲁科尔沁旗| 什邡市| 嘉兴市| 白沙| 许昌县| 新营市| 扬州市| 义马市| 小金县| 栾城县| 辉南县| 宜丰县| 广宁县| 昆明市| 杂多县| 河西区| 陵川县| 西青区| 克山县| 汤原县| 漠河县| 乌苏市| 思茅市| 三门峡市| 密山市| 岫岩| 汉川市|