深入理解 MessageQueue , Message , Looper , Handler

来源:互联网 发布:linux组织文件目录结构 编辑:程序博客网 时间:2024/04/24 20:29

概念详解:

 1、MessageQueue:

       是一种数据结构,见名知义,就是一个消息队列,存放消息的地方。每一个线程最多只可以拥有一个MessageQueue数据结构。
创建一个线程的时候,并不会自动创建其MessageQueue。通常使用一个Looper对象对该线程的MessageQueue进行管理。主线程创建时,会创建一 
个默认的Looper对象,而Looper对象的创建,将自动创建一个Message Queue。其他非主线程,不会自动创建Looper,要需要的时候,通过调用prepare函数来实现。 
2、Message:

          消息对象,Message Queue中的存放的对象。一个Message Queue中包含多个Message。 Message实例对象的取得,通常使用Message类里的静态方法obtain(),该方法有多个重载版本可供选择;它的创建并不一定是直接创建一个新的实例, 而是先从Message Pool(消息池)中看有没有可用的Message实例,存在则直接取出返回这个实例。如果Message Pool中没有可用的Message实例,则才用给定的参数创建一个Message对象。调用removeMessages()时,将Message从Message Queue中删除,同时放入到Message Pool中。除了上面这种方式,也可以通过Handler对象的obtainMessage()获取一个Message实例。 
 3、Looper: 
           是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象
和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象 创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能接受Message。如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message然后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle() 将其放入Message Pool中。
4、Handler: 
            消息的处理者,handler负责将需要传递的信息封装成Message,通过调用handler对象的obtainMessage()来实现; 
将消息传递给Looper,这是通过handler对象的sendMessage()来实现的。继而由Looper将Message放入MessageQueue中。 
当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler对象收到该消息后,调用相应的handler对象的handleMessage()方法
对其进行处理。

 实例:

[java] view plain copy
  1. package com.amker.test.app;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Looper;  
  7. import android.os.Message;  
  8. import android.view.View;  
  9. import android.widget.Button;  
  10. import android.widget.TextView;  
  11. public class MainActivity04 extends Activity {  
  12.     private Button btnTest;  
  13.     private TextView textView;  
  14.     private Handler handler;  
  15.     @Override  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         setContentView(R.layout.test);  
  19.         btnTest = (Button)this.findViewById(R.id.btn_01);  
  20.         textView = (TextView)this.findViewById(R.id.view_01);  
  21.          
  22.         btnTest.setOnClickListener(new View.OnClickListener() {  
  23.             @Override  
  24.             public void onClick(View arg0) {  
  25.                 //启动线程  
  26.                 new MyThread().start();      
  27.             }  
  28.         });  
  29.     }  
  30.          
  31.        class MyHandler extends Handler{  
  32.         public MyHandler(Looper looper){  
  33.             super(looper);  
  34.         }  
  35.         public void handleMessage(Message msg){  
  36.             super.handleMessage(msg);  
  37.             textView.setText((String)msg.obj);  
  38.         }  
  39.     }      
  40.        class MyThread extends Thread{  
  41.         public void run(){  
  42.             Looper.prepare(); //创建该线程的Looper对象  
  43.             //这里Looper.myLooper()获得的就是该线程的Looper对象了  
  44.             handler = new ThreadHandler(Looper.myLooper());  
  45.              
  46.             Message msg = handler.obtainMessage(1,1,1,"我自己");  
  47.             handler.sendMessage(msg);  
  48.             Looper.loop();   
  49.         }  
  50.         //定义线程类中的消息处理类  
  51.         class ThreadHandler extends Handler{  
  52.             public ThreadHandler(Looper looper){  
  53.                 super(looper);  
  54.             }  
  55.             public void handleMessage(Message msg){  
  56.                 //这里对该线程中的MessageQueue中的Message进行处理  
  57.                 //这里我们再返回给主线程一个消息  
  58.                 //加入判断看看是不是该线程自己发的信息  
  59.                 if(msg.what == 1 && msg.obj.equals("我自己")){  
  60.                     handler = new MyHandler(Looper.getMainLooper());  
  61.                     Message msg2 = handler.obtainMessage(1,1,1,"禀告主线程:我收到了自己发给自己的Message");  
  62.                     handler.sendMessage(msg2);                  
  63.                 }  
  64.             }  
  65.         }  
  66.     }  
  67. }   
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工商被恶意举报怎么办 店铺被工商举报怎么办 被买单侠恐吓怎么办? 团伙作案刑事拘留怎么办取保 欢乐麻将老输怎么办 回不了家怎么办身份证 没注意闯红灯了怎么办 摩托车被套牌了怎么办? 发现员工偷钱怎么办 盗窃刑事拘留7天怎么办 盗窃抓不到人怎么办 发现宿舍被盗后怎么办(  ) 发现宿舍被盗后怎么办() 回收到赃物电瓶怎么办 不知情买了赃物怎么办 盗窃单位要报警怎么办 上网吸烟被逮住怎么办 有人在微信骂我怎么办 网吧抽烟被拍照怎么办 诈骗被拘留该怎么办 行政拘留人跑了怎么办 车牌号被偷了怎么办 当员工提出辞职怎么办 老员工提出辞职怎么办 家人进看守所了怎么办 被贷款中介诈骗怎么办 喝完酒吐难受怎么办 犯罪嫌疑人死在看守所怎么办 犯罪嫌疑人死不承认怎么办 高血压进了看守所怎么办 看守所里被欺负怎么办 老师上课迟到了怎么办 艾滋病看守所不收怎么办 没能力偿还债务怎么办 监狱病人的癌症怎么办 监狱的传染病人怎么办 犯人在监狱重病怎么办 亲戚被关拘留所怎么办 打麻将被拘留怎么办 轻伤检察院不批捕怎么办 吸毒人被拘留怎么办