android开发 - 消息队列

来源:互联网 发布:淘宝如何寻找货源 编辑:程序博客网 时间:2024/06/14 09:00
消息队列










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 0
原创粉丝点击