Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> android中子線程更新UI的方式

android中子線程更新UI的方式

編輯:Android開發教程

一、為何寫作此文

你是不是經常看到很多書籍中說:不能在子線程中操作ui,不然會報錯。你是不是也遇到了如下的疑惑(見下面的代碼):

  
      (Bundle savedInstanceState) {  
        .onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        tv = (TextView) findViewById(R.id.tv);  
        Thread.currentThread().setName();  
         LooperThread().start();  
    }  

         {  

          
          () {  
            Thread.currentThread().setName();  
            tv.setText();  
        }  
    }  

上面確實在子線程中操作ui了,但是他並不會報錯,為什麼呢?這不是跟書上的說法剛好相悖嗎?當時自己也是遇到了這個問題,所以有了這篇博客,感謝網絡上的那些前輩們的無私分享,現將自己的整理和思考記錄下來。

二、引入

在Android開發過程中,常需要更新界面的UI。而更新UI是要主線程來更新的,即UI線程更新。如果在主線線程之外的線程中直接更新頁面顯示常會報錯。拋出異常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.怎麼解決呢?下面我會詳細列出子線程更新ui的方法:

三、子線程更新UI的方法

1、用Handler+message

主線程中定義Handler,子線程發消息,通知Handler完成UI更新。

mHandler =  Handler() {  
     
     (Message msg) {  
        
       myText.setText( 來自網絡的信息);  
      .handleMessage(msg);  
   }  
  };  
     {  
       () {  
            
            loadNetWork();  
            Message msg =  Message();  
            mHandler.sendMessage(msg);
      }  
 }

handler的原理圖如下:

2、用runOnUiThread更新

這個最好用, 凡是要刷新頁面的地方,都可以按照如下方式寫。

 Thread() {
              () {
                
                runOnUiThread( Runnable(){

                    
                      () {
                        
                        imageView.setImageBitmap(bitmap);
                    }

                });
            }
        }.start();

這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象(通過構造函數傳遞)。

3、View.post(Runnable r)

方法解釋:從Runnable派生你的子類,重載run()方法。然後調用View.post(myRunnableObj)即可把你的Runnable對象增加到UI線程中運行。

  ( View v ) {  
         Thread(  Runnable() {  
                  () {  
                       
                          loadNetWork();  
                          myText.(  Runnable() {  
                                  myText.setText( 來自網絡的信息);  
                          });  
                 }  
        }).start();  
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved