關(guān)于線程通信模型

01消息分發(fā)

  • 當(dāng)Message對象被發(fā)送到Handler,并嘗試被處理時检疫,Handler會對消息進(jìn)行分發(fā)九杂,即決定由誰處理消息。

  • 在消息機(jī)制中脚线,可以有一下3種處理消息的方式:

     【高優(yōu)先級】在創(chuàng)建Message對象時搁胆,調(diào)用Message類的靜態(tài)方法public static Message obtain(Handler h,Runnable callback),指定callback 參數(shù),則由callback處理消息邮绿;
    
     【中等優(yōu)先級】在創(chuàng)建Handler 對象時渠旁,調(diào)用public Handler(Callback callback)構(gòu)造方法,指定callback ,將由Handler.Callback接口中定義的 public boolean handleMessage(Message msg) 方法處理消息船逮;
    
    【低等優(yōu)先級】自定義類繼承Handler類顾腊,創(chuàng)建自定義的Handler對象,并在自定義類中重寫public void handlerMessage(Message msg) 方法挖胃,由重寫的方法處理消息杂靶;
    

代碼

處理消息方式一

布局部分

  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="cn.tedu.third.MainActivity" >
    
         <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="88dp"
            android:max="100"
            android:progress="0    />
    
        <Button
            android:id="@+id/btn_progress"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/progressBar1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="70dp"
            android:text="更新進(jìn)度" 
            android:onClick="showProgress"/>
    </RelativeLayout>

Activity中

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.ProgressBar;
    
    public class MainActivity extends Activity {
        private Handler handler;
        private ProgressBar pbProgress;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            handler=new Handler();
            pbProgress=(ProgressBar) findViewById(R.id.progressBar1);
        }
    
        public void showProgress(View v){
            new UpdateProgressThread().start();
            
        }
        
        private class UpdateProgressThread extends Thread{
            private int i=0;
            @Override
            public void run() {
                for(;i<100;i++){
                    Message msg =Message.obtain(handler, new Runnable() {
                        
                        @Override
                        public void run() {
                            
                            pbProgress.setProgress(i+1);
                        }
                    });
                    msg.sendToTarget();
                    
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                
                }
            }
        }   
    }

處理消息方式二

布局部分與上面布局一樣

activity中

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Handler.Callback;
    import android.os.Message;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.ProgressBar;
    
    
    public class MainActivity extends Activity {
        private ProgressBar pbProgress;
        private Handler handler;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            handler=new Handler(new InnerCallBack());
            pbProgress=(ProgressBar) findViewById(R.id.progressBar1);
        }
        
        
        public void showProgress(View v){
            new UpdateProgressThread().start();
            
        }
        
        private class InnerCallBack implements Callback{
    
            @Override
            public boolean handleMessage(Message msg) {
                if(MESSAGE_UPDATE_PROGRESS==msg.what){
                    pbProgress.setProgress(msg.arg1);
                }
                return false;
            }
            
        }
        
        private static final int MESSAGE_UPDATE_PROGRESS = 0;
        
        private class UpdateProgressThread extends Thread{
    
            @Override
            public void run() {
                for(int i =0 ;i<100;i++){
                    Message.obtain(handler, MESSAGE_UPDATE_PROGRESS, i+1, 0).sendToTarget();
                    
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                
                }
                
            }
        }

    }

處理消息方式三

布局部分與上面布局一樣

activity中

        import android.app.Activity;
        import android.os.Bundle;
        import android.os.Handler;
        import android.os.Message;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.view.View;
        import android.widget.Button;
        import android.widget.ProgressBar;
        
        public class MainActivity extends Activity {
            private ProgressBar pbProgress;
        
            private Handler handler;
            
            private static final int MESSAGE_UPDATE_PROGRESS = 0;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                handler=new InnerHandler();
                pbProgress=(ProgressBar) findViewById(R.id.progressBar1);
            }
        
            public void showProgress(View v) {
                new UpdateProgressThread().start();
        
            }
            
            private class InnerHandler extends Handler{
                @Override
                public void handleMessage(Message msg) {
                    if(MESSAGE_UPDATE_PROGRESS==msg.what){
                        pbProgress.setProgress(msg.arg1);
                    }
                }
            }
            
            
            private class UpdateProgressThread extends Thread{
        
                @Override
                public void run() {
                    for(int i =0;i<100;i++){
                        Message.obtain(handler, MESSAGE_UPDATE_PROGRESS, i+1, 0).sendToTarget();
                    
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    }
                 
                }
            }
        }

02.線程通信模型詳解

  • 由于向目標(biāo)線程發(fā)送消息的線程可能比較多,為了確保目標(biāo)線程能收到這些消息酱鸭,并逐一處理吗垮,在消息機(jī)制中,存在4中角色:

      1.Message :消息的載體凹髓;
      2.Handler:發(fā)送消息烁登、處理消息
      3.MessageQueue:消息隊(duì)列;
      4.Looper:消息隊(duì)列的管理者蔚舀;
    
c.png

Message

  Message是消息機(jī)制中信息的載體防泵;

Handler

- Handler用于執(zhí)行消息的發(fā)出和處理;
- Handler關(guān)聯(lián)一個獨(dú)立的線程及消息隊(duì)列蝗敢,即Handler在那個線程創(chuàng)建捷泞,則綁定到那個線程的消息隊(duì)列;
- Handler的創(chuàng)建決定了他所在的線程寿谴,則處理對應(yīng)線程中收到的消息锁右;

MessageQueue

  - MessageQueue是Message的容器,它是一個先進(jìn)先出、后進(jìn)后出的隊(duì)列咏瑟;
  - 任何Message在被發(fā)出后拂到,都會被先放到MessageQueue中,然后再逐一的發(fā)送給目標(biāo)码泞;
  - MessageQueue由Looper實(shí)現(xiàn)管理兄旬,因此,開發(fā)人員無須對其進(jìn)行處理余寥。

Looper

- Looper是MessageQueue的管理者领铐;
- 當(dāng)Message被發(fā)出后,由Looper關(guān)聯(lián)的MessageQueue.IdleHandler將其添加到MessageQueue中宋舷;
- Looper在工作時绪撵,會循環(huán)讀取MessageQueue,然后實(shí)現(xiàn)消息的發(fā)送祝蝠;
- 每個線程都有獨(dú)立的Looper音诈,由各個Looper管理各個線程的消息隊(duì)列;
- Looper必須調(diào)用Prepare()系列方法進(jìn)行初始化绎狭,然后再調(diào)用loop()方法才會開始工作细溅;
- 每個Handler在初始化之前,對應(yīng)的線程中必須有匹配的Looper儡嘶,而主線程默認(rèn)即存在已經(jīng)啟動的Looper谒兄。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市社付,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邻耕,老刑警劉巖鸥咖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異兄世,居然都是意外死亡啼辣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門御滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸥拧,“玉大人,你說我怎么就攤上這事削解。” “怎么了氛驮?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵腕柜,是天一觀的道長。 經(jīng)常有香客問我,道長盏缤,這世上最難降的妖魔是什么砰蠢? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任唉铜,我火速辦了婚禮台舱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潭流。我一直安慰自己竞惋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布幻枉。 她就那樣靜靜地躺著碰声,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熬甫。 梳的紋絲不亂的頭發(fā)上胰挑,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音椿肩,去河邊找鬼瞻颂。 笑死,一個胖子當(dāng)著我的面吹牛郑象,可吹牛的內(nèi)容都是我干的贡这。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼厂榛,長吁一口氣:“原來是場噩夢啊……” “哼盖矫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起击奶,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辈双,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后柜砾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湃望,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年痰驱,在試婚紗的時候發(fā)現(xiàn)自己被綠了证芭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡担映,死狀恐怖废士,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝇完,我是刑警寧澤湃密,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布诅挑,位于F島的核電站,受9級特大地震影響泛源,放射性物質(zhì)發(fā)生泄漏拔妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一达箍、第九天 我趴在偏房一處隱蔽的房頂上張望没龙。 院中可真熱鬧,春花似錦缎玫、人聲如沸硬纤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筝家。三九已至,卻和暖如春邻辉,著一層夾襖步出監(jiān)牢的瞬間溪王,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工值骇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莹菱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓吱瘩,卻偏偏與公主長得像道伟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子使碾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容