美文网首页
安卓消息机制

安卓消息机制

作者: killerbee | 来源:发表于2020-08-06 01:48 被阅读0次

    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启动时开始计时的,甚至可以是定期重置的(所有消息都减去同一个值,不过这样就复杂了没有必要)。

    相关文章

      网友评论

          本文标题:安卓消息机制

          本文链接:https://www.haomeiwen.com/subject/gwvarktx.html