码迷,mamicode.com
首页 > 其他好文 > 详细

handler机制

时间:2015-05-20 08:14:16      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

在android系统当中,有一个非常重要的铁律,在UI线程之外,是不能修改UI的,在后台线程,新起一个线程,得到的数据结果是不能直接反映在UI上的。
这样的一个问题,我们急需一种机制来解决。
MainThread (UI线程)和 WorkrThread (除了主线程之外的其他的线程都叫workThread)
workthread从原则上来讲是不允许操作UI的,个别控件除外(ProgressBar)
在一个应用程序当中,主线程通常用于接收用户的界面输入以及将运算结果反馈给用户
anr问题:application not response
所以说对一些可能产生阻塞的操作要放在workthread中完成

java 中线程回顾:线程的实现方式的两种区别
线程的生命周期:线程的线程体执行完后,线程的生命周期就结束了,就进入了死亡状态
多线程同步:当多个线程访问同样一个资源,就会产生多线程竞争资源的问题,有可能会产生多线程错误

什么是handler?
handler就是一个处理器,handler,looper,messageQueue 所构成的这样的一个系统,是android系统当中最重要的消息传递,以及消息处理机制
handler负责把消息对象加入到消息队列当中去,looper(循环器)负责把消息对象从消息队列当中取出。handler负责放,looper负责从消息队列中往外取。
如果消息队列中没有消息对象,那么负责取出消息对象的LOOP的这行代码就会产生阻塞(处于等待的状态),looper把消息对象从消息队列中取出来之后干什么呢?
LOOPER将会调用handler的handlerMessage方法来处理message对象
疑问:handler负责放,hanler最后又负责处理????

handler looper messageQUEUE最大的作用就是解决线程间通信

ThreadLocal --线程本地变量
执行ThreadLocal对象的set(Object obj)方法,将会向存入一个以当前线程为键的键值对
执行ThreadLocal 对象的get()方法,将会根据当前线程对象为键,取出与之对应的值,值可以是任意的数据,键是线程对象,相当于特殊的hashmap
普通的hashmap的键值都是对象

为什么要引入handler机制?
新启动的线程周期性的改变UI界面组件的属性值,就需要采用handler消息传递机制了

handler类的主要作用有两个:
在新启动的线程中发送消息,在主线程中获取、处理消息。
每个线程只拥有一个Looper,loop方法负责读取消息队列中的消息,读到信息之后就把消息交给发送该消息的handler处理

在UI线程中,系统已经初始化了一个Looper对象,因此程序直接创建handler即可,然后通过handler发送处理消息
程序员自己启动的子线程,程序员需要自己创建一个LOOP对象,用prepare方法创建looper对象。
Loop方法不断的从消息队列中取出消息,交给该消息对应的handler处理
handler把消息发送给messagequeue处理,并负责处理looper分给他的消息

handler机制

标签:

原文地址:http://www.cnblogs.com/zhangkefan/p/4516218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!