Handler,Looper,Message

一、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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值