Handler,Looper,Message

来源:互联网 发布:jsp中写java方法 编辑:程序博客网 时间:2024/05/29 09:28

一、Looper

       假设当前有一个线程a,在a中执行以下操作:

Looper调用Looper.prepare()方法,在线程a中创建一个Looper实例,同时被创建的这个Looper对象中包含了一个MessageQueue对象。

之后调用Looper.loop()方法,loop()方法内有一个for(;;)循环,使得当前线程a进入一个无限循环,不停地从线程a的MessageQueue对象中读取消息,若读取到消息message,

则调用此Message实例内的target属性所指向的Handler实例来处理此消息。

      一个线程只能有一个Looper实例,一个Looper只能有一个MessageQueue实例。


二、Handler

       在如上所创建的线程a中创建一个Handler实例handler_a,此实例则会绑定到创建它的线程a中。在另外的一个线程b中持有一个handler_a的引用,当线程b需要向线程a发送消息时,首先需要创建一个Message对象msg,此Message对象的target属性被设置为handler_a。然后使用handler_a.sendMessage(msg) 方法将其发送出去,这使得msg被加入到线程a的Looper对象内的MessageQueue对象内, 在之后的线程a的循环中点会被读取到,然后调用msg的target属性所指向的handler的handlerMessage()方法将其处理。

      创建handler实例时需要实现其handleMessage(Message)方法,在这个方法中对接收到的Message对象进行处理。


三、Message

       Message的创建:使用Message.obtain()类方法进行创建,有3个int型的属性what,arg1,arg2,一个Object型的属性object,一个Bundle型的属性data,用来承载要发送的信息。有一个Handler型的属性target指明处理此消息的handler。

       此外Message对象还包括一个Runable型的属性callback,如果此属性不为null,则handler在接收到消息之后会直接调用callback对象的run()方法,而handler本身的handlerMessage()方法将不会被调用。只有当callback属性为null时,才会用handleMessage()方法来处理这条消息。



0 0
原创粉丝点击