Android异步消息处理(一)
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创建一个异步消息处理线程。
作者“冯小卫”
补充:移动开发 , Android ,