欢迎来到天天文库
浏览记录
ID:38288962
大小:3.98 MB
页数:33页
时间:2019-06-07
《handler的各种用法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Looper20.1LooperhandlerMessageQueue关系图20.2Looper的api介绍30.3源码解析40.3.1looper源码解析40.3.2ActivityThread中消息循环机制原理源码解析50.4子线程向主线程(UI线程)发送消息(android只能在主线程中更新UI)80.4.1方法1—》通过handler的sendMessage方法80.4.2方法二—》通过Activity里的runOnUiThread()90.4主线程向子线程发送消息101.handler的介绍112.Message的介绍132.1Message的ap
2、i讲解132.2Message里面的方法setData(Bundlebundle)143.handler处理消息方式1—通过sendXXX方法153.1Message.obtain()153.2Message.obtain(handler)163.3Message.obtain(handler,what)173.4Message.obtain(h,what,arg1,arg2)183.5Message.obtain(handler,what,arg1,arg2,obj)193.6handler.obtainMessage()193.7handler.setE
3、mptyMessage(what)203.8hanlder.sendEmptyMessageAtTime(intwhat,longuptimeMillis)223.9handler.sendEmptyMessageDelayed(what,delayMillis)233.10handler.sendManage和handler.sendEmptyManage的区别234.handler处理消息方式2---通过postXXX方法处理消息245.handler处理消息的相应的例子295.1从网上下载图片,显示在ImagView上295.11第一种方法(访问网络的
4、操作没有封装)295.12第二种方法(封装访问网络的操作)305.2更新TextView内容(通过TextView的追加来更新内容)325.3handler----》更新进度条33Looper0.1LooperhandlerMessageQueue关系图UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,该Looper与UI主线程一一对应。使用ThreadLocal的目的是保证每一个线程只创建唯一一个Looper。之后其他Handler初始化的时候直接获取第一个Handler创建的Looper。Looper初始化的时候会创
5、建一个消息队列MessageQueue。Looper对象的执行需要初始化创建MessageQueue用Looper.prepare方法,使用Looper.loop方法启动消息队列管理机制,退出时还要使用Looper.release方法释放资源Activity源码里的Looper:主线程的Looper0.2Looper的api介绍Looper类用来为线程运行消息循环,线程默认情况下没有与之相关联的消息循环。为了创建消息循环,在运行loop的线程里调用prepare方法,然后调用loop方法来处理消息直到循环结束。0.3源码解析0.3.1looper源码解析0.
6、3.2ActivityThread中消息循环机制原理源码解析首先程序在启动的时候,会执行ActivityThread类的main方法第一步:生成与本地相关的Looper对象可以看到这里和普通线程循环读取消息序列不同:1、普通线程使用prepare()就行了,主线程使用的是premMainlooper();2、普通线程会在中间创建一个帮忙的looper的handler对象,而主线程会从当前线程获取到主线程的handler(gethandler)第二步:Thread与handler的绑定首先获得handler然后调用Looper.loop()这里会先获取到loo
7、per对象的消息队列messagequeue,然后进入死循环for(;;),不断的.next获取到最前的msg,然后进入关键一步msg.target.dispatchMessage(msg);这里的target就是执行消息队列任务的handler,而dispatchMessage进入源码看下是什么到此ActivityThread中消息循环机制完成,总结下:1、prepareMainLooper进行消息队列的创建,生成looper对象,且让sMainLooper指向它2、通过gethandler获取当前线程handler,指向一个H对象3、进入Looper死循
8、环不断地获取消息并且让handlemessge去处理
此文档下载收益归作者所有