本文主要有三大方面
一是handler,Looper,messagequeue之间概念
二是线程间通信时handler的使用,包括在主线程中创建handler和在子线程中创建handler
三是对于looper的源码的简单分析,帮助理解记忆
Chapter One,背景介绍
虽然Android是单线程模型(即只能在主线程更新UI),但是仅仅靠主线程是远远不够的,比如如果在主线程中进行请求网络的操作,那就会造成阻塞,用户用起来会很不舒服。所以,除了UI的更新外,一些耗时的操作可以通过开启其他线程来处理。主线程和子线程之间需要数据交换等通信,子线程和子线程之间同样也需要通信。
目前线程中的通信是借助handler实现的,但handler的作用不仅限于线程间通信,还有延时启动ruannable,还有一点需要说明:一个线程Thread对应一个looper,一个looper对应一个消息队列messagequeue,一个消息队列messagequeue中可以包含多条message消息,一个线程中可以有多个handler。
所以也就是说对于一个线程,如果想要使用handler,必须存在一个looper,一个messagequeue。对于主线程而言,在创建主线程ActivityThread时会先将looper准备好,所以在主线程中可以直接使用handler。而如果是想要创建子线程自己的handler则必须自己手动对message loop进行prepare。
研究一段代码分三步:whw----------what,how,why,接下来就根据这个来学习下handler
转载请注明出处:
本文出自
海天之蓝 通信之线程间通信(上)-handler
Chapter Two , 概念型介绍
一:Handler:
handler可以用来发送和处理message和runnable对象(其实就是handler有两大作用,一是handler可以将message和runnable对象发送给消息队列入列,二是消息队列对消息的处理又是在handler中)每一个handler和一个单一线程以及一个该线程的消息队列对应。当创建一个handler时,会与创建他的线程和线程的消息队列绑定,从这时候开始,handler会向消息队列发message和runnables,并且在message和runnable从消息队列出来时message和runnable进行处理。
对于handler有两种用法:在未来的某一刻去执行一个message或者是runnable.或者是在另一个线程中执行一个action(即在该线程中使用另一个线程中的handler处理消息)
可以通过post,postDelay sendMessage ,sendMessageDelayed来安排一个消息进入消息队列。
- post:针对runnable对象而言的,当接受到runnable对象时消息队列会调用enqueuemessage方法将消息入列
- sendMessage:针对message而言的,会将一个带有bundle数据的msg入列,该msg会被handler处理,所实现的handler必须重写handlermessage方法来处理消息队列中的message。
当你的应用程序正在进行处理消息的操作时,应用程序主线程会专门用来运行一个消息队列来管理顶级的应用程序对象(activities,broadcastreceivers,等等)以及任何他们创建的窗口。你也可以创建自己的线程,可以通过handler来实现子线程和主线程的交互。和之前一样调用post和sendMessage方法,