0
点赞
收藏
分享

微信扫一扫

android开发 - 消息队列


消息队列










MessageQueue


消息队列,存放消息的地方,按照FIFO规则执行,每一个


线程只可以拥有一个MessageQueue,在创建Looper对象


会创建一个MessageQueue


消息对象,MessageQueue中存放的对象。一个MessageQueue


中可以包含多个Message对象,可以通过Message.obtain()


或者Handler.obtainMessage()获取Message对象。


但是这并不一定是直接创建一个新的实例,而是先从消息池


中看有没有可用的Message实例,存在则直接取出,返回这个实例


如果消息池中没有可用的Message实例,则才用给定的参数创建一个


Message对象,调用removeMessages()时,将Message从MessageQueue


中删除,同时放入到消息池中。












Looper


操作MessageQueue,一个Looper对应一个MessageQueue.


通过调用Looper.mylooper()可以获得当前线程的Looper


对象,Looper从MessageQueue中取出Message,然后,交由


Handler的handlerMessage()进行处理,处理完成后,调用


Message.recycle()将其放入消息池中










Handler


消息的处理者,handler负责将需要传递的信息封装成


Message对象,然后调用sendMessage()方法将消息放入


MessageQueue中,当MessageQueue中,当MessageQueue


循环到该Message,调用相应的handler对象的handlerMessage()


方法对其进行处理,Handler都可以共享同一Looper和MessageQueue





















Handler 和 Message




 一


 public class MainActivity extends Activity {


     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
     }
     
     private Handler handler = new Handler(){
     public void handleMessage(Message msg) {
     System.out.println("what=" + msg.what + ",arg1="+ 


 msg.arg1 + ",arg2=" + msg.arg2 + ",obj=" + msg.obj);
     };
     };
     
     class MyTask implements Runnable{ 
@Override
public void run() { 
//第一种方式
Message msg = Message.obtain();
msg.what = 1;
msg.arg1 = 2;
msg.arg2 = 3;
msg.obj = "jack";
handler.sendMessage(msg);

//第二种方式
Message msgs = Message.obtain(handler);
msgs.what = 1;
msgs.arg1 = 2;
msgs.arg2 = 3;
msgs.obj = "jack";
msgs.sendToTarget();

//第三种方式
Message msgMessage = Message.obtain


 (handler,33);
msgMessage.arg1 = 11;
msgMessage.arg2 = 12;
msgMessage.obj = "rose";
msgMessage.sendToTarget();

//第四种方式
Message msgs2 = Message.obtain


 (handler,33,"I am obj");
msgs2.sendToTarget();

   //第五种方式
Message msgs3 = Message.obtain


 (handler,33,20,21,"我是第五种方式");
msgs3.sendToTarget();

//第六中方式
Message msgs4 = Message.obtain(handler);
Bundle bunle = new Bundle();
bunle.putStringArray("str", new String[]


 {"aaa","bbb","ccc"});
msgs4.setData(bunle);
msgs4.sendToTarget(); 
} 
     }
     
     public void buttonClick(View v){
     new Thread(new MyTask()).start();
     } 
 }

举报

相关推荐

0 条评论