溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

與Handler有關(guān)的幾個概念

發(fā)布時間:2020-07-10 09:23:40 來源:網(wǎng)絡(luò) 閱讀:781 作者:VincentTung 欄目:開發(fā)技術(shù)

注: 相關(guān)圖片都是用的別人的

1.Handler 主要用于消息處理

2.Message:消息,子線程向UI線程發(fā)送消息,消息中攜帶者相應(yīng)數(shù)據(jù)。

3.MessageQueue:消息隊列,有一個格Message消息組成

4.Looper :信息泵,循環(huán)處理消息隊列MessageQueue中的Message,將其發(fā)送給相應(yīng)的Handler

5.LooperThread,如果要非UI線程中實例化Handler,必須有Looper,而一般子線程中是不存在Looper的,一個線程可以有一個Looper對象和一個MessageQueue,必行顯示調(diào)用Looper.loop( )方法給其分配出Looper對象才能使用。

一個線程對應(yīng)一個Looper

一個Looper對應(yīng)一個MessageQueue。

一個Looper可以對應(yīng)多個Handler。

記住:HandlerThread =普通Thread+Looper

詳細(xì)的運行過程看下兩圖:

 

與Handler有關(guān)的幾個概念

 

與Handler有關(guān)的幾個概念

一.Handler的方法使用

Handler可以將兩種類型消息放到消息隊列中,一種是Message另種是Runnable對象,如果是Message對象時,通過HandlerhandleMessage( )方法處理,如果是Runnable對象的時候,當(dāng)Handler拿到Looper發(fā)送過來的Runnable對象的時候,會直接運行Runnablerun( )方法,注意Runnable對象時運行在相應(yīng)Handler所在的線程中的(一般是UI線程),沒有start,直接調(diào)用了run( )方法。

 

  1. /** 
  2.                  *  
  3.                  * handler.post(Runnable); 
  4.                  *  
  5.                  *  
  6.                  */ 
  7.                 handler.post(new Runnable() { 
  8.  
  9.                     @Override 
  10.                     public void run() { 
  11.                         isChanging = true
  12.                         bar.setProgress(count); 
  13.                         count++; 
  14.  
  15.                     } 
  16.  
  17.  
  18.                 }); 
  19.  
  20.  
  21.                 /** 
  22.                  *  
  23.                  *  
  24.                  * hanlder.postDelayer(Runnable,timeDelayed); 
  25.                  *  
  26.                  */ 
  27.                 handler.postDelayed(new Runnable() { 
  28.  
  29.                     @Override 
  30.                     public void run() { 
  31.                         isChanging = true
  32.                         bar.setProgress(count); 
  33.                         count++; 
  34.  
  35.                     } 
  36.  
  37.                 },100); 
  38. /** 
  39.  * 重點看一下handler是怎么發(fā)送msg的 
  40.  *  
  41.  * 1.可以發(fā)送空的Message 
  42.  * 2.可以定時發(fā)送Message 
  43.  * 3.Message可以攜帶的數(shù)據(jù)有   int what,int arg1,int arg2,Object obj, Bundle bundler(通過msg.setData(Bundle bundler)來添加到Message對象中) 
  44.  *  
  45.  * 4.Message通過Handler.obtain()方法實例化,可以進(jìn)行有參、無參實例化,其中有參實例化是可以出傳入 int what,int arg1,int arg2, Object obj 
  46.  * @author VicentTung 
  47.  * 
  48.  */ 
  49.  
  50.  
  51.  
  52.  
  53.                 /** 
  54.                  * 1.發(fā)送空的Message 
  55.                  */ 
  56.  
  57.                 handler.sendEmptyMessage(0); 
  58.  
  59.                 handler.sendEmptyMessageAtTime(0, System.currentTimeMillis()); 
  60.  
  61.                 handler.sendEmptyMessageDelayed(0, 100); 
  62.  
  63.  
  64.                 /** 
  65.                  *2. 發(fā)送非空Message(Message是new出來的) 
  66.                  */ 
  67.                 Message msg =new Message(); 
  68.                 Bundle data_bundle = new Bundle(); 
  69.                 data_bundle.putString("name", "小明"); 
  70.                 data_bundle.putInt("age", 12); 
  71.                 msg.arg1=1; 
  72.                 msg.arg2=2; 
  73.                 msg.what=3
  74.                 msg.obj="success"
  75.                 msg.setData(data_bundle); 
  76.                 handler.sendMessageDelayed(msg, 100); 
  77.  
  78.                 /** 
  79.                  * 3.發(fā)送非空Message(Message是handler.obtain()出來的) 
  80.                  */ 
  81.  
  82.                  
  83.                 String obj="hahah"
  84.                 int arg1=111
  85.                 int arg2=222
  86.                 Message msg_obtain =handler.obtainMessage(); 
  87.              
  88.                 /** 
  89.                  *  各種各樣的帶參數(shù)的obtain()方法實例化出Message對象 
  90.                  */ 
  91.                 msg_obtain =handler.obtainMessage(what); 
  92.                 msg_obtain = handler.obtainMessage(what, obj); 
  93.                 msg_obtain = handler.obtainMessage(what, arg1, arg2); 
  94.                 msg_obtain =handler.obtainMessage(what, arg1, arg2, obj); 
  95.  
  96.                  
  97.                 /** 
  98.                  * 4.Message的移除 
  99.                  */ 
  100.  
  101.                  
  102.                 if(handler.hasMessages(0)){ 
  103.                      
  104.                     handler.removeMessages(0); 
  105.                 } 

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI