Android開發之使用Handler刷新UI控件


一、為什么必須使用Handler

  1. 線程安全問題

          這個問題要理解的話很容易,如果沒有這個約束,那么同時有兩個線程對一個UI控件進行調整,
    那么控件自然就沒法正常的工作,而為了解決這種二義性(就是一個東西同時被多個使用者使用,
    從而無法判斷按哪個使用者來調整)。而Handler永遠都是在UI主線程,這就意味着對一個控件的修
    改永遠只會有一個線程,不會存在多個線程同時修改一個控件。

  2. 統一管理

          通過Handler可以統一進行對UI的管理,因為Handler采用消息處理的機制。簡單理解就是另
    一個線程發送一個編號給消息所在的線程,那么該線程的消息處理程序就會收到該消息並進行處理,
    而消息采用int類型,所以int能夠表示多少種數字就以為着有多少消息可以給你使用(因為存在系統
    的消息,所以可能有一部分被系統的消息占有,而不能使用)。

二、Handler介紹

  1. handleMessage(Message msg)

       需要重寫的方法,該方法為處理消息的核心函數。

  2. sendEmptyMessage(int what)

       發送指定的消息,該方法為僅僅只是傳遞一個int值來表示發送的消息類型。

三、重寫handleMessage(Message msg)

1 Handler handler = new Handler(){
2           @Override
3           public void handleMessage(Message msg){
4                    //獲得通過handler.sendEmptyMessage發送的消息編碼
5                    int what = msg.what;
6                    /* 處理代碼 */
7           }
8 }

 

四、使用handler發送消息

1 handler.sendEmptyMessage(0x101);

 

五、實例

  1. 新建一個線程來給主線程發送消息
     1 public class MainActivity extends Activity{
     2        private static final int send_msg_code =  0x101;
     3        
     4        Handler handler = new Handler(){
     5             @Override
     6             public void handleMessage(Message msg){
     7                     int what = msg.what;
     8                     if(what == send_msg_code){
     9                             Toast.makeText(MainActivity.this,"成功",Toast.LENGTH_SHORT).show();
    10                     }
    11             }
    12        }       
    13 
    14        @Override
    15        protected void onCreate(Bundle savedInstanceState)
    16        {
    17                 new Thread(new Runnable(){
    18                           handler.sendEmptyMessage(send_msg_code);
    19                 }).start();
    20        }
    21 }

 

六、擴展

  1. post(Runnable r)

       將r加入到消息隊列中(其實就是利用UI主線程執行一段代碼,這樣可以隨時在其他線程中調整控件)

  2. postDelayed(Runnabled r,long delayMillis)

       將r加入到消息隊列中,並在指定時間之后觸發(單位為毫秒)

  3. removeMessages(int what)

       取消消息的發送

  4. sendMessages(Message msg)

      通過Message發送消息(這樣可以將數據包裝進去,一起發送過去)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM