1:安卓系统通过handler来发送消息,主要作用是为了更新UI,或者执行一些逻辑操作
2:安卓消息机制通过handler,message,messagequeu,looper 来实现
3:关于handler:
(1)handler的作用是将message发送到messageQueue中去,同时将自己的引用赋值给message的target
(2)不可以在子线程中使用handler的无参构造方法,因为handler在绑定的时候需要一个looper对象,有两种方法可以绑定
looper.prepar();
Handler handler=new Handler();
Looper.loop();
或者通过构造方法传入一个looper;
Looper looper=....
Handler handler=new Handler(looper);
(3):Handler有哪些发送消息的方法
sendMessage(Messagemsg)
sendMessageDelayed(Messagemsg,longuptimeMillis)
post(Runnabler)
postDelayed(Runnabler,longupti meMillis)
sendMessageAtTime(Messagemsg,longwhen)
sendEmptyMessage(intwhat)
sendEmptyMessageDelayed(intwhat,longuptimeMillis)
sendEmptyMessageAtTime(intwhat,longwhen)
4: 关于Looper:
(1)looper的作用是将message从MessageQueue中取出来,并将其交给Handler#dispatchMessage(Message) 方法
(2)Looper 是如何与 Thread 关联的:
Looper 与 Thread 之间是通过 ThreadLocal 关联的,这个可以看 Looper#prepare() 方法
private static void prepare(boolean quitAllowed){
if(sThreadLocal.get()!=null){
throw newRuntimeException("Only one Looper may be created per thread");
}
sThreadLocal.set(newLooper(quitAllowed));
}
(3)Looper.loop() 方法是一个死循环为什么不会阻塞APP
5:关于MessageQueue:
(1)MessageQueue的作用是负责message的插入和取出
(2)messageQueue是有序的链式结构,排序的依据是Message#when字段
Message#when 是一个时间,用于表示 Message 期望被分发的时间,该值是 SystemClock#uptimeMillis() 与 delayMillis 之和。
SystemClock#uptimeMillis() 是一个表示当前时间的一个相对时间,它代表的是自系统启动开始从0开始的到调用该方法时相差的毫秒数。
Message#when 为什么不用 System.currentTimeMillis() 来表示
System.currentTimeMillis()代表的是从1970-01-01 00:00:00到当前时间的毫秒数,这个值是一个强关联系统时间的值,我们可以通过修改系统时间达到修改该值的目的,所以该值是不可靠的值。
比如手机长时间没有开机,开机后系统时间重置为出厂时设置的时间,中间我们发送了一个延迟消息,过了一段时间通过 NTP 同步了最新时间,那么就会导致延迟消息失效
同时Message#when只是用时间差来表示先后关系,所以只需要一个相对时间就可以达成目的,它可以是从系统启动开始计时的,也可以是从APP启动时开始计时的,甚至可以是定期重置的(所有消息都减去同一个值,不过这样就复杂了没有必要)。
网友评论