当前位置: 移动技术网 > IT编程>移动开发>Android > Android开发Handler的工作原理解析

Android开发Handler的工作原理解析

2018年11月05日  | 移动技术网IT编程  | 我要评论

皇德耀世vs皇族,欢欢文苑小说,凌海市政府

android开发handler的工作原理解析

作用

便于在子线程中更新主ui线程中的控件
这里涉及到了ui主线程和子线程

ui主线程

它很特别。通常我们会认为ui主线程将页面绘制完成,就结束了。但是它没有。它在一直默默等待着来自用户操作控件发生的事件消息。

这里的事件和其中包含的信息都被封装为一个message,它是parcelable对象。
主线程不能同时处理所有的事件,这个时候就需要一个存放消息的队列message queue
它里面包含了一个叫looper,用来管理这个消息池子
handler在其中负责发送和处理事件
去查看activity中的,会发现它会自己创建一个final类型的handler,还有looper的身影。

looper

这个用来管理messagequeue的,主要的执行方法在looper.loop()方法中。大家都这么说
ui主线程会给自己创建一个looper对象。子线程的looper需要手动的创建。
当handler在ui主线程上进行实例化的时候,自动持有主线程的looper。

messagequeue

它叫队列,之前以为它里面会有array或者list之类的,但是在源码里面没有看到。
它队列的实现,是通过message对象中的属性变量next,来指向下一个message

message

消息对象的实体

handler

它的内部实现包含子线程thread、回调函数callback、成员变量looper。
每当handler调用sendmessage()(或者其它类似相关方法)的时候,将会向messagequeue里面添加一个message。添加的时候会去检查该message与队列中已经存在的message的when属性,判断谁在前谁在后
其实,两条线程之间的数据交互,一般采用回调方法。handler的实现原理也是依据如此。

具体的使用方法

在ui主线程中调用没有参数的构造方法创建handler的时候,使用的looper对象就是主线程的looper
在子线程中调用没有参数的构造方法创建handler的时候,需要主动创建looper对象:looper.prepare()方法;不然在运行的时候就会报错说"can't create handler inside thread that has not called looper.prepare()"
在子线程中可以将主线程的looper作为构造方法的参数创建handler,就不需要在子线程中创建自己的looper了。这个时候回调方法handlemessage(message msg)方法将会放在主线程中执行,所以这里面不要放特别耗时的操作。
handler mhandler =new handler(looper.getmainlooper())。
在activity中的handler中含有未执行的delay消息的时候,调用activity.onfinish()方法之后,ondestory()不会立刻被调用。所以一般情况下,在调用onfinish()方法的时候需要清理一下mhandler里面的消息。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网