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对象。

更多相关文章

  1. Android应用程序消息处理机制
  2. Android中的AsyncTask和Handler应用实例二
  3. Android(安卓)服务器推送技术
  4. Android推送通知指南
  5. Android(安卓)消息处理 -- Looper 、Handler类
  6. 你不知道的Runnable接口,深度解析Runnable接口
  7. Android的消息机制(java层)
  8. 简单解释Android中的任务、进程和线程
  9. android使用mysql的方法总结

随机推荐

  1. Android Okhttp 断点续传面试解析
  2. Android Studio推荐几个非常有用的工具
  3. Android自定义下拉刷新动画--仿百度外卖
  4. Android中可以做的两件坏事---破解锁屏密
  5. Android之UI学习篇一:TextVeiw如何显示丰
  6. 3D引擎--可移植到Android的开源的引擎及
  7. Android(安卓)远程图片获取和本地缓存(一)
  8. iOS 与 Android 之战,乔布斯是否正在重复
  9. Android(安卓)System.exit(code) and and
  10. Mono For Android(安卓)开发入门系列——