版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Looper20.1Looper handler MessageQueue关系图20.2 Looper的api介绍30.3 源码解析40.3.1 looper源码解析40.3.2 ActivityThread中消息循环机制原理 源码解析50.4子线程向主线程(UI线程)发送消息(android只能在主线程中更新UI)80.4.1 方法1通过handler的sendMessage方法80.4.2 方法二通过Activity里的runOnUiThread()90.4 主线程向子线程发送消息101.handler的介绍112.Message的介绍132.1 Message的api讲解132.2 Me
2、ssage里面的方法setData(Bundle bundle)143.handler处理消息方式1通过sendXXX方法153.1 Message.obtain()153.2 Message.obtain(handler)163.3 Message.obtain(handler,what)173.4 Message.obtain(h, what, arg1, arg2)183.5 Message.obtain(handler, what, arg1, arg2, obj)193.6 handler.obtainMessage()193.7 handler.setEmptyMessage(wh
3、at)203.8 hanlder.sendEmptyMessageAtTime(int what,long uptimeMillis)223.9 handler.sendEmptyMessageDelayed(what, delayMillis)233.10 handler.sendManage和handler.sendEmptyManage的区别234.handler处理消息方式2-通过postXXX方法处理消息245.handler处理消息的相应的例子295.1从网上下载图片,显示在ImagView上295.11 第一种方法(访问网络的操作没有封装)295.12 第二种方法(封装访问网络的
4、操作)305.2 更新TextView内容(通过TextView的追加来更新内容)325.3 handler -更新进度条33Looper0.1Looper handler MessageQueue关系图UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创建一个消息队列MessageQueue。Looper对象的执行需要初始化创建Messa
5、geQueue用Looper.prepare方法,使用Looper.loop方法启动消息队列管理机制,退出时还要使用Looper.release方法释放资源Activity源码里的Looper:主线程的Looper0.2 Looper的api介绍Looper类用来为线程运行消息循环,线程默认情况下没有与之相关联的消息循环。为了创建消息循环,在运行loop的线程里调用prepare方法,然后调用loop方法来处理消息直到循环结束。0.3 源码解析0.3.1 looper源码解析0.3.2 ActivityThread中消息循环机制原理 源码解析首先程序在启动的时候,会执行ActivityThre
6、ad类的main方法第一步:生成与本地相关的Looper对象可以看到这里和普通线程循环读取消息序列不同:1、普通线程使用prepare()就行了,主线程使用的是premMainlooper();2、普通线程会在中间创建一个帮忙的looper的handler对象,而主线程会从当前线程获取到主线程的handler(gethandler)第二步:Thread与handler的绑定首先获得handler然后调用Looper.loop()这里会先获取到looper对象的消息队列messagequeue,然后进入死循环for(;),不断的.next获取到最前的msg,然后进入关键一步msg.target.
7、dispatchMessage(msg);这里的target就是执行消息队列任务的handler,而dispatchMessage进入源码看下是什么到此ActivityThread中消息循环机制完成,总结下:1、prepareMainLooper 进行消息队列的创建,生成looper对象,且让sMainLooper指向它2、通过gethandler获取当前线程handler,指向一个H对象3、进入Looper死循环不断地获取消息并且让handlemessge去处理。这和普通线程在本质上是完全一样的。0.4子线程向主线程(UI线程)发送消息(android只能在主线程中更新UI)0.4.1 方法
8、1通过handler的sendMessage方法记住:Activity里有一个默认的Looper对象,用来处理子线程发来的消息Activity源码Looper: Looper.myLooper();源码0.4.2 方法二通过Activity里的runOnUiThread()0.4 主线程向子线程发送消息Looper类别用来为一个线程开启一个消息循环。默认情况下Android中新开启的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环)注意:UI的更新必须在主线程中完成,将更新UI的消息发送到了主线程的消息对象,让主线程做处理1.handler的介绍安
9、排messages是通过 post(Runnable), postAtTime(Runnable, long),postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)方法来完成的。The post 版本允许你将Runnable对象进队,这些Runnable对象被收到的消息队列所调用the sendMessage 版本允许您排列一个包含了大量将被Handler的h
10、andleMessag(Message)方法处理的数据的Message对象(需要你实现Handler的一个子类)如果new一个无参构造函数的Handler对象,那么这个Handler将自动与当前运行线程相关联,也就是说这个Handler将与当前运行的线程使用同一个消息队列,并且可以处理该队列中的消息如果new一个带参构造函数的Handler对象,那么这个Handler对象将与参数所表示的Looper相关联。注意:此时线程类应该是一个特殊类HandlerThread类,一个Looper类的Thread类,它继承自Thread类根据这个例子返回的结果,可以看出,新线程Id与主用户界面的线程Id不同
11、。由于我们调用了thread.start()方法,真正的创建了一个新线程,与原来的线程处于不同的线程上下文中,因此打印输出的线程Id是不同的。2.Message的介绍2.1 Message的api讲解Message.obtain方法的源码2.2 Message里面的方法setData(Bundle bundle)3.handler处理消息方式1通过sendXXX方法3.1 Message.obtain()3.2 Message.obtain(handler)Message.obtain(handler)源码3.3 Message.obtain(handler,what)3.4 Message.
12、obtain(h, what, arg1, arg2)3.5 Message.obtain(handler, what, arg1, arg2, obj)3.6 handler.obtainMessage()Handler.obtainMessage源码3.7 handler.setEmptyMessage(what)Hanlder.sendEmptyMessage源码:3.8 hanlder.sendEmptyMessageAtTime(int what,long uptimeMillis)为什么不是等5s之后TextView上显示内容,而是立刻显示内容,5000不是等待5s吗,求解?因为s
13、endEmptyMessageAtTime(what, inMillis)是在固定时间发送消息,其中第二个参数是已开机时间为准,你开机时间到现在已经超过了5S,所以就立即执行了3.9 handler.sendEmptyMessageDelayed(what, delayMillis)Handler.sendEmptyMessageDelayed源码3.10 handler.sendManage和handler.sendEmptyManage的区别handler.sendEmptyMessage(what):what描述的是消失是干什么的,主要用于进度条对话框更新完以后,发送一个带what的消息
14、,关闭进度条对话框handler.sendManage(Message msg):发送带内容的消息4.handler处理消息方式2-通过postXXX方法处理消息boolean post (Runnable r)Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.Returns true if the Runnable was successfully placed in to the me
15、ssage queue. Returns false on failure, usually because the looper processing the message queue is exiting.将Runnable r添加到消息队列。 runnable将在此处理程序所连接的线程上运行。如果Runnable成功放入消息队列,则返回true。 在失败时返回false,通常是因为正在处理消息队列的looper正在退出自定义的线程中是不能更新UI的,但是如果遇到更新UI的事情,我们可以用handler的post()方法来将更新UI的方法体,直接传送到主线程中,这样就能直接更新UI了。H
16、andler的post()方法就是将Runnable中的代码段传送到主线程。post直接可以把一段代码当做变量一样传递,但是请不要传送耗时操作的代码到主线程中看源码解析handler.post(runnable)Handler对象把Message压到了MessageQueue队列里面然后我们去分发信息的点去看是如何执行的public static final void loop() Looper me = myLooper(); MessageQueue queue = me.mQueue; while (true) Message msg = queue.next(); / might bl
17、ock /if (!me.mRun) / break; / if (msg != null) if (msg.target = null) / No target is a magic identifier for the quit message. return; if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " " + msg.callback + ": " + msg.what
18、); msg.target.dispatchMessage(msg); if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " " + msg.callback); msg.recycle(); Looper对象把MessageQueue里面的Message逐个取出来,注意看msg.target.dispatchMessage(msg)这一句。Message类定义了一个字段target,这个字段就是Han
19、dler类型,存的对象就是创建这个message的对象,也就是我们的handler对象。然后就是调用我们的handler里面的dispatchMessage(msg)方法了public void dispatchMessage(Message msg) if (msg.callback != null) handleCallback(msg); else if (mCallback != null) if (mCallback.handleMessage(msg) return; handleMessage(msg); 看到没有,一开始我们的Runnable传进来,然后调用GetPostMessage方法把Runnable赋值给了Massage里
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度采光井玻璃更换与维护合同3篇
- 二零二五年度气象站气象数据安全保障合同3篇
- 2024苏州租赁合同含宠物饲养及养护服务条款3篇
- 2024版民间借贷合同范例
- 2025年度茶楼装修工程消防设施合同范本4篇
- 2025年度10kv配电站施工期间质量检测与验收合同正规范本3篇
- 2025年度教育机构LOGO知识产权许可合同范本3篇
- 2025年度智能物流系统全国代理销售合同4篇
- 2025年度厂房施工合同施工人员培训协议(新版)3篇
- 2025年度智能工厂改造装修合同模板3篇
- 小学四年级数学知识点总结(必备8篇)
- GB/T 893-2017孔用弹性挡圈
- GB/T 11072-1989锑化铟多晶、单晶及切割片
- GB 15831-2006钢管脚手架扣件
- 医学会自律规范
- 商务沟通第二版第4章书面沟通
- 950项机电安装施工工艺标准合集(含管线套管、支吊架、风口安装)
- 微生物学与免疫学-11免疫分子课件
- 《动物遗传育种学》动物医学全套教学课件
- 弱电工程自检报告
- 民法案例分析教程(第五版)完整版课件全套ppt教学教程最全电子教案
评论
0/150
提交评论