1. 写文章之前的声明:首先,文章写上原创标签是有点牵强的,本质上是读书笔记。上周周六的时候参加了博文视点的一个作者交流会,编辑送我了一本android内核方面的书《Android内核剖析》,拿回来读了一下,非常的棒。首先作者知识丰富,对android认识很到位,水平比很多其他Android编者高不少。其次,水平高正常,写书的吗,都有点水平,但是作者写书的时候,非常用心,语言通俗易懂,干脆。这点就非常的难了。自己写书的时候就有感觉,知道是一回事,表达出来,表达的清楚,又是另外一回事。最后,系列文章适合对android有一定认识的朋友,没有android基础的,不要看,浪费时间。

2.写这些文章的意义:书中有大量的内核分析,其实对于应用层开发人员来说,这些东西用不上,我仅仅是把做应用程序开发用的上的东西抽出来,然后加一些自己的东西。

什么是异步消息处理:

对于普通的线程来说,执行完run()方法内的代码后线程就结束了。而异步消息处理线程是指:线程启动后会进入一个无限循环体之中,每执行一次,从线程内部的消息队列中取出一个消息,并回调相应的消息处理函数,执行完一个消息后则继续循环。如果消息队列为空,线程会暂停(一般也就是我们调用休眠方法),直到消息队列中又新的消息。

异步消息处理特点:

从上面的描述可以看出,异步消息处理其实就是一种线程机制,只不过这种机制用的上的地方非常多,最后就单独提炼了“异步消息处理”这个名词。

异步消息处理的使用情况:

一般情况下,如果任务具有以下两个特点,就可以使用异步消息处理机制:

1.任务常驻内存(编程中体现就是run()方法中是无限循环),比如用于处理用户事件的任务。

2.任务需要根据外部传递的消息做不同的操作。

通用的实现异步消息处理机制的方式:

1.每个异步线程内部包含一个消息队列,用来缓存消息。

2.线程的执行中使用while(true)进行无限循环,循环体中从消息队列取出消息,并根据消息的来源,回调相应的消息处理函数(从这里可以看出:异步消息处理,消息的具体处理并不是异步消息处理机制负责的,异步消息处理机制只是负责转发消息给处理函数)

3.其他外部线程可以向本线程的消息队列发送消息,由于有两个或以上的线程访问消息队列,那么,消息队列内部的读写操作必须进行加锁。

Android中异步消息处理的实现方式:

在线程内部有一个或多个Handler对象,外部线程通过该Handler对象的引用向本线程发送异步消息,消息通过Handler对象加入消息队列(MessageQueue)。线程内部只有一个MessageQueue对象,线程的run()方法从MessageQueue中读取消息,并回调Handler对象中的回调函数handleMessage()处理消息。

在编程中应该注意的问题:

1.由于异步消息处理机制的一个重要环节是MessageQueue,所以,在发送消息之前,必须确定MessageQueue已经创建。在android中,给应用程序员提供的创建MessageQueue的接口是:Looper.prepare()。

2.由于异步消息处理机制是一个循环线程,而循环的启动也是由程序员控制的,所以,在你要处理消息之前,应该启动循环。在android中,给应用程序员提供的启动循环的接口是:Looper.loop()。

3.细心的朋友可能发现,在activity中使用Handler发送,处理消息时,并没有上面两步,其实是系统帮我们做了的。在创建Activity之前,系统就会为Activity创建一个异步消息处理线程。

更多相关文章

  1. Android中的消息机制
  2. Unity3D研究院之与Android相互传递消息(十九)
  3. Android(安卓)内存泄漏相关
  4. Android(安卓)面试 15 家大厂,这个问题是必问!
  5. Android消息处理惩罚机制(Handler、Looper、MessageQueue与Messag
  6. 图解 Android(安卓)Handler 线程消息机制
  7. Android面试题集锦(2019最新总结)
  8. AsyncTask 研究一 怎么使用
  9. 【技术直通车】处理ArcGIS Android工程和ADT v17中的依赖

随机推荐

  1. 深入SQLite多线程的使用总结详解
  2. XML入门的常见问题(四)
  3. java中枚举的详细使用介绍
  4. XML入门的常见问题(三)
  5. J2ME Mobile 3D入门教程系列文章之一
  6. XML入门的常见问题(二)
  7. XML入门的常见问题(一)
  8. php输出xml格式字符串
  9. go语言是脚本语言吗
  10. go是动态语言还是静态语言