《handler的各种用法》由会员分享,可在线阅读,更多相关《handler的各种用法(33页珍藏版)》请在金锄头文库上搜索。
1、Looper.20.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 的介绍 .
2、112.Message 的介绍 .132.1 Message 的 api 讲解 .132.2 Message 里面的方法 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,
3、obj) .193.6 handler.obtainMessage() .193.7 handler.setEmptyMessage(what).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.hand
4、ler 处理消息的相应的例子 .295.1 从网上下载图片,显示在 ImagView 上 .295.11 第一种方法 (访问网络的操作没有封装) .295.12 第二种方法 (封装访问网络的操作) .305.2 更新 TextView 内容(通过 TextView 的追加来更新内容 ) .325.3 handler -更新进度条 .33Looper0.1Looper handler MessageQueue 关系图UI 主线程初始化第一个 Handler 时会通过 ThreadLocal 创建一个 Looper,该 Looper 与 UI 主线程一一对应。使用ThreadLocal 的目的是保
5、证每一个线程只创建唯一一个 Looper。之后其他 Handler 初始化的时候直接获取第一个Handler 创建的 Looper。Looper 初始化的时候会创建一个消息队列 MessageQueue。Looper 对象的执行需要初始化创建 MessageQueue 用 Looper.prepare 方法,使用 Looper.loop 方法启动消息队列管理机制,退出时还要使用 Looper.release 方法释放资源Activity 源码里的 Looper:主线程的 Looper0.2 Looper 的 api 介绍Looper 类用来为线程运行消息循环,线程默认情况下没有与之相关联的消息
6、循环。为了创建消息循环,在运行 loop 的线程里调用 prepare 方法,然后调用 loop 方法来处理消息直到循环结束。0.3 源码解析0.3.1 looper 源码解析0.3.2 ActivityThread 中消息循环机制原理 源码解析首先程序在启动的时候,会执行 ActivityThread 类的 main 方法第一步:生成与本地相关的 Looper 对象可以看到这里和普通线程循环读取消息序列不同:1、普通线程使用 prepare()就行了,主线程使用的是 premMainlooper();2、普通线程会在中间创建一个帮忙的 looper 的 handler 对象,而主线程会从当前
7、线程获取到主线程的 handler(gethandler)第二步:Thread 与 handler 的绑定首先获得 handler然后调用 Looper.loop()这里会先获取到 looper 对象的消息队列 messagequeue,然后进入死循环 for(;),不断的.next 获取到最前的 msg,然后进入关键一步 msg.target.dispatchMessage(msg);这里的 target 就是执行消息队列任务的handler,而 dispatchMessage 进入源码看下是什么到此 ActivityThread 中消息循环机制完成,总结下:1、prepareMainLoo
8、per 进行消息队列的创建,生成 looper 对象,且让 sMainLooper 指向它2、通过 gethandler 获取当前线程 handler,指向一个 H 对象3、进入 Looper 死循环不断地获取消息并且让 handlemessge 去处理。这和普通线程在本质上是完全一样的。0.4 子线程向主线程(UI 线程)发送消息(android 只能在主线程中更新 UI)0.4.1 方法 1通过 handler 的 sendMessage 方法记住:Activity 里有一个默认的 Looper 对象,用来处理子线程发来的消息Activity 源码 Looper: Looper.myLoo
9、per();源码0.4.2 方法二 通过 Activity 里的 runOnUiThread()0.4 主线程向子线程发送消息Looper 类别用来为一个线程开启一个消息循环。默认情况下 Android 中新开启的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper 对象,开启消息循环)注意:UI的更新必须在主线程中完成,将更新 UI的消息发送到了主线程的消息对象,让主线程做处理1.handler 的介绍安排 messages 是通过 post(Runnable), postAtTime(Runnable, long),postDelayed(Runnable, lon
10、g), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)方法来完成的。The post 版本允许你将 Runnable 对象进队,这些 Runnable 对象被收到的消息队列所调用the sendMessage 版本允许您排列一个包含了大量将被 Handler 的 handleMessag(Message)方法处理的数据的Message 对象(需要你实现 Handler 的一个子类)如果new一个无参构造函数的Handler对象,那么这个Handler将自动与当前运行线程相关联,也就是说这个 Handler 将与当前运行的线程使用同一个消息队列,并且可以处理该队列中的消息如果 new 一个带参构造函数的 Handler 对象,那么这个 Handler 对象将与参数所表示的 Looper相关联。注意:此时线程类应该是一个特殊类 HandlerThread