Android 中的消息模型(Message,MessageQueue,handle,looper)

Android 中的消息模型(Message,MessageQueue,handle,looper,)
Android 中的消息通讯

1.Android 中线程的应用机制?

1)Android 中所有的耗时操作应在工作线程执行。
2)Android 中所有的UI操作应该在主线程(UI线程)执行。

FAQ?
1)主线程执行执行耗时操作好吗? 不好,这样会阻塞UI操作。
2)工作执行完耗时操作,假如有数据要传递给主线程,那如何实现?


2.Android 中多线程应用时的消息模型?

使用Android中消息模型的目的是尽量不要去阻塞
主线程,然后给用户一种比较友好的体验。
 
Android 中消息模型关注对象:

1)Message :数据的载体
2)MessageQueue: 存储多个消息对象
3)Looper:迭代消息队列,取出消息。
4)Handler:发送,处理消息队列中的消息。

Android中消息模型关注对象伪代码实现:

class Message{
    Object obj;数据
    int what; 数据要用于做什么
    .....
}
class MessageQueue{
    Object[] message=new Object[5];
    public void put(Message msg){}
    public Message tabke(){}
}
class Looper{
    private MessageQueue msgQ;
    public void loop(){
        while(true){....}
    }
}
class Handler{
    public void sendMessage(Message msg){}
    public void handleMessage(Message msg){}
}

3.Android 中消息模型应用案例?

1)工作线程发消息给主线程?
2)主线程发消息给主线程?
3)主线程发消息给工作线程?

记住:
1)主线程在启动时已经默认创建了Looper和消息队列对象
2)给谁发消息就让handler关联谁的Looper.
3)handler的handleMessage方法运行在哪个线程由handler
关联的looper而定。

4.Android 中消息模型对象相关方法总结?
1)Message
数据的载体
 (obj数据,
what数据要用于做什么,
obtain()获得一个消息,....)
2)MessageQueue存储多个消息对象
3)Looper(prepare()创建一个looper,并绑定到当前线程,
myLooper()获得当前线程Looper,
loop(),
getMainLooper()默认关联当前线程looper,
quit())
4)Handler(sendMessage消息发送给谁,取决于handler关联的looper,
handleMessage可以执行消息的处理操作,sendXXXXX)

1主线程给主线程发消息
1、通过主线程给主线程发消息
 消息的分类:系统消息、用户自定义消息
 主线程中发消息要借助主线程Handler对象。
|-->当我们发送自定义消息时,Handler需要我们自己构建。
|-->一个线程可能关联很多个handler对象
 主线程发送的消息会存储在主线程的MQ中。
 主线程中的消息队列的管理者是主线程的Looper。
|-->此Looper内置一个阻塞式无限循环。
|-->此循环的目的是遍历和Looper相关联的MQ对象
|-->此Looper负责从MQ中获取消息,并将消息交给Handler。
FAQ:
1)主线程的Looper对象何时创建?系统启动时
此Looper对象创建以后会绑定到当前线程中(借助ThreadLocal)
2)主线程中的MQ何时创建?Looper对象创建时,MQ自动创建。
3)MQ自定义消息何时创建?如何创建?
       |-->需要时创建。
       |-->创建方法?
       Message msg=Message.obtain();
       Message msg=handler.obtainMessage();
4)主线程中的Handler对象何时创建?
       |-->需要时创建。
       |-->创建方式?
     匿名内部类:new Handler(){重写HandleMessage方法}
     构建handler子类

2 子线程给主线程发送消息
方案:在子线程中获取主线程的Handler对象
如何获取:
在主线程构建Handler对象。
在子线程中构建主线程Handler对象??
handler=new Handler(Looper.getMainLooper());
3 子线程如何创建Looper对象
1、子线程中创建Looper的理由?
 子线程中默认没有Looper对象
 子线程中需要使用子线程的handler对象发送消息
2、子线程创建Looper的方式?创建Looper时自动构建MQ
Looper.prepare();//构建过程?先从当前线程取,若无则创建。创建后绑定到当前线程。
...构建handler
Looper.loop();
FAQ:
a. 子线程的handler构建时需要子线程的Looper
b. 子线程的Handler对象发送消息是发送到子线程的MQ
c. 子线程在处理消息时不能更新主线程界面。
4 主线程如何获取子线程的Handler对象
方案:设法在主线程中获取子线程的Looper对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值