1. 首先大家需要知道,android对java core library中的众多class都作了修改,包括Thread, 所以android中的java.lang.Thread并非和java SE中的java.lang.Thread一模一样。还有其他众多的基础类也都有修改。
2. 关于时间的模型,参考android.os.SystemClock类的api,有三种模型:System.currentTimeMillis(),uptimeMillis()和elapsedRealtime()。我们这里要关心的是uptimeMillis()。
3. Looper类,Looper的作用是将一个普通线程转变为一个“不停地处理消息的线程”,一旦在某个线程的run()方法中启动了Looper.prepare()和Looper.loop(),那么这个线程就会有一个MessageQueue(在Looper构造函数中创建,关联在该Looper instance上)。其他线程或者该线程本身可以通过某个Handler往该MessageQueue中发送消息,而Looper在loop()循环中会不停地去取出消息,执行消息(如何执行见下面Handler中的描述)。参见Looper类api以了解更多内容。
4. MessageQueue:表面上该类是一个先进先出的队列,但其背后实现其实是一个linked list.该类有一个enqueueMessage()方法,用于将消息塞入队列中。每个Message对象上有一个when域,是个绝对时间(uptimeMillis度量模型),表明该消息何时应该真正“被递送".塞入队列的消息根据when的大小排序串起来,排在前面的when的时间小。当Looper每次从queue中取出消息对象的时候,会用当前时间和队列头上的消息的when比较,如果when<=当前时间了则被取出,否则消息继续悬挂在队列中等待"被递送"。Handler.postDelayed()或sendMessageDelayed()相关方法底下则是直接调用了MessageQueue的enqueueMessage(),将消息直接悬挂入队列中。
5. Message: 该对象表示塞入queue的消息。该对象上有一些重要的域:arg1,arg2,obj,setData()这些是消息所携带的数据;when表示该消息何时应该被递送(前面已有解说);target表示该消息该由哪个handler对象来处理,通过handler来发送消息的时候handler都会在发送方法中把这个域给置上(置成自己);callback表示该Message是否包装了一个Runnable对象,用handler.post()相关方法发送一个Runnable的时候其实底下还是发送了一个Message对象,该对象的callback设成了该Runnable instance; next域,用来将塞入MessageQueue的各个消息串起来,在MessageQueue中被使用。what代表该消息的code,即具体是什么类型的消息,每个what都在其handler的namespace中,因此不用担心一个handler中定义的what和另一个handler中定义的what有冲突,你只要保证一个handler instance处理的所有消息的what没有冲突即可。when,data,target,callback,next这些域都是package可见的,在相关的其他类中被使用,或者通过getter,setter方法被暴露。
6. Handler:一个handler instance被new出来的时候,会自动关联到该线程的Looper对象上,也就关联到了该Looper的MessageQueue上。发送任何消息都需要通过handler类。handler的众多方法都是线程安全的,因此假如我们在主线程中创建了一个handler instance,你可以把该handler传递给某个其他线程。其他线程利用该handler instance的post或send方法发送消息给该handler关联的message queue,也就是主线程的message queue, 主线程的Looper然后取出这些消息,拿出Message.target, 然后调用target上的dispatchMessage()方法,也就是Handler.dispatchMessage(). 该方法中如果发现该Message包装了一个Runnable,就直接调用该Runnable的run()方法;如果不是,如果该handler上挂了一个Handler.Callback对象,则调用他的handleMessage(), 否则则调用handler自己的handleMessage().注意这三类处理都是在主线程中所做。具体可参见Handler类源码。
7. 每个android的程序一启动便会有一个主线程(UI线程),该线程负责显示用户界面,管理各个component(activity, receiver等),处理用户界面上的各类消息等。该线程一启动内部便已经初始化了一个Looper,因此主线程已经有了一个MessageQueue。在Activity的onCreate方法中可以直接new Handler(),便会直接挂到该主线程的Looper上。
8. android.os.HandlerThread: 为了方便把一个普通线程变成一个有Looper和MessageQueue的线程,便对Thread类进行了包装,产生了此类。在onLooperPrepared()方法中你可以new出handler instance, 挂到该线程的Looper上。或者你先启动该HandlerThread,然后拿到他上面的Looper,把该Looper作为参数调用new Handler(Looper)构造函数,也可以实现handler和该thread上message queue的绑定。这个类只是为了方便实现Looper和message queue这种模式而以。

其他可参考的文章:
http://codinghard.wordpress.com/2009/05/16/android-thread-messaging/
http://mindtherobot.com/blog/159/android-guts-intro-to-loopers-and-handlers/

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. EditText 的setKeyListener()方法的用法是输入某些特殊的字符
  3. [置顶] Canvas开篇之drawBitmap方法讲解
  4. android实战项目五做一个倒计时的button
  5. 据说程序员是最爱学习的群体,IT男都知道,这个行业日新月异,必须不断
  6. [置顶] java/android 设计模式之单例模式
  7. Android(安卓)9.0 的 recent 键/事件的拦截
  8. Android(安卓)WebView常见问题及解决方案汇总 .
  9. EventBus的使用详解

随机推荐

  1. 【Appium】打开手机自带的浏览器
  2. Android(安卓)设计中常用的设计模式
  3. Cheatsheet: 2011 05.01 ~ 05.09
  4. 学习笔记|Android中的setRequestorientat
  5. Android(安卓)实现简单登录界面 (跑马灯设
  6. Android(安卓)NotificationListenerServi
  7. Usage of AAPT(Android(安卓)Asset Packa
  8. 使用ContentProvider管理照片
  9. android里camera支持的预览尺寸的获取
  10. Android杂一