消息模型及其伪代码

Android 中线程应用消息模型

Android 中线程之间的交互,通常是要求尽量不要阻塞主线程的环境中执行的。在Android中若要实现这个过程通常要借助如下几个对象:

1)Message(消息对象:数据的载体)

封装了消息的属性.

2)MessageQueue(消息队列:存储多个消息对象)

MessageQueue底层为一个阻塞式队列BlockingQueue,阻塞式队列的好处在于从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。

3)Looper(迭代器:迭代消息队列)

Looper中的loop方法已无限循环的模式迭代消息队列,不断地从消息队列中取消息.

4)Handler(处理器:发送,处理消息)

Handler能够让你发送和处理消息,以及Runnable对象;每个Handler对象对应一个Thread和Thread的消息队列。当你创建一个Handler时,它就和Thread的消息队列绑定在一起,然后就可以传递消息和runnable对象到消息队列中,执行消息后就从消息队列中退出。

以上几个对象的执行过程构成了Android中的消息模型。


这些对象的伪代码实现:

1.Message,封装消息的属性.
public class Message {
public Object obj;
public Handler handler;
}


2.MessageQueue底层为一个BlockingQueue(阻塞式队列)

阻塞式队列:在使用take和put方法时会等待而不会抛出异常.

 public class MessageQueue {
BlockingQueue<Message> msgQ=new ArrayBlockingQueue<>(5);
public MessageQueue() {
}
public void put(Message msg){
try {
msgQ.put(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
public Message take(){
try {
return msgQ.take();
} catch (InterruptedException e) {
return null;
}
}
public void clear(){
msgQ.clear();
}

}

3.Looper

public class Looper {
private static MessageQueue msgQ;


public Looper() {
msgQ=new MessageQueue();
}
public MessageQueue getmsgQ(){
return msgQ;
}


private static ThreadLocal<Looper> tl=new ThreadLocal<>();
public static void prepare() {//创建Looper
if(tl.get()!=null){
throw new RuntimeException("looper已经存在");
}
tl.set(new Looper());
}
public static Looper myLooper(){//得到Looper
return tl.get();
}
private static boolean isloop=true;
public static void loop(){//以无限循环迭代消息队列
while(isloop){
Message msg=msgQ.take();
msg.handler.HandleMessage(msg);
}

}
public void quit(){
msgQ.clear();
isloop=false;
}

}

4.Handler

public class Handler {
private Looper looper;
public Handler(Looper looper) {
this.looper = looper;
}
public void SendMessage(Message msg){//发送消息的方法,发送至HandleMessage处理消息;
msg.handler=this;
looper.getmsgQ().put(msg);
}
public void HandleMessage(Message msg) {
//此方法一般由使用此方法的人重写具体处理消息的方法.
}


}






























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值