看了handler源码后,对其用法及原理的一点分析
来源:互联网 发布:mac打开csgo黑屏 编辑:程序博客网 时间:2024/04/30 06:10
Looper维持了一个消息队列,下面是looper源代码中loop函数,实现looper中消息队列的循环。
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
msg.target.dispatchMessage(msg);
msg.recycle();
}
}
那么Message具体是什么呢?
打开源码一看,居然这么简单,其实就包含了一些数据,有几个obtain函数用于构造message对象
<span style="font-family:SimSun;"> int flags; long when; Bundle data; Handler target; Runnable callback; </span>那么有了looper消息队列,有了message,貌似以及可以完成所有需要的功能了,那么handler是个什么鬼。 有没有想过,即使有了message,looper队列,可以不断地加取message,但是去了message总得用的吧,handler就是做这么个事,,实现往消息队列里加消息,取消息,并作出处理。 Handler mHandler = new Handler(); mHandler.postDelayed(new Runnable() { @Override public void run() { //。。。。 } }, 2000); 其中的runnble就是个interface,定义了一个函数——run Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { } };这是处理message的回调。 那么handler对callback的处理是什么顺序呢?
public void dispatchMessage(Message msg) {
//如果Message本身有callback,则直接交给Message的callback处理
if(msg.callback != null) {
handleCallback(msg);
}else {
//如果本Handler设置了mCallback,则交给mCallback处理
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
//最后才是交给子类处理
handleMessage(msg);
}
}
Message如果自带了callback处理,则交给callback处理。
Handler如果设置了全局的mCallback,则交给mCallback处理。
如果上述都没有,该消息则会被交给Handler子类实现的handleMessage来处理
下面是我自己编的一段代码,在不同线程上进行操作,用handlerThread类实现同步
HandlerThread ht = new HandlerThread("mythread");
ht.start();
Looper looper = ht.getLooper();
Handler myhandler = new Handler(looper);
Runnable myrun = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("second Thread"+Thread.currentThread().getId());
}
};
Message myMessage = new Message();
myMessage = Message.obtain(myhandler, myrun);
myhandler.sendMessage(myMessage);
- 看了handler源码后,对其用法及原理的一点分析
- Handler原理讲解及源码分析
- android 源码分析后 看 Thread、Handler、Looper、Message的使用
- Handler源码分析原理
- Handler源码原理分析
- 对Handler工作原理的分析
- 对Handler的一点封装
- 对Handler的一点封装
- 看你的ADT版本及对其升级
- handler机制原理源码分析
- 从源码角度看Handler原理
- handler的原理分析
- Handler的源码分析
- Handler的源码分析
- handler的源码分析
- synchronized的实现原理及jvm对其优化
- Android源码分析--Handler机制的实现与工作原理
- 最简洁的Handler、Looper、Message源码级原理分析
- java.lang.IllegalArgumentException: Page directive: invalid value for import
- oracle中V$SESSION的用法
- jquery实现菜单树
- 蚕吃桑叶吐丝,蜂采花酿蜜,人吃饭长精神
- js 页面刷新location.reload和location.replace的区别小结
- 看了handler源码后,对其用法及原理的一点分析
- 安卓控件getRawX与getX区别
- 3-2 构造函数的调用-SDUT
- iOS9之前,UINavigationController控制器子类无法控制器StatusBar的样式
- MySQL安装设置详细教程
- 10 个让程序员放松的网站
- C++的继承与派生:公有,私有,保护
- 浏览器与HTTP网络协议缓存原理分析 转自网界网:http://news.cnw.com.cn/news-china/htm2015/20151027_322909.shtml
- 场景二:synchronized修饰方法