Handler,Message,MessageQueue,Looper之间的相爱相杀
2016-04-21 14:09
447 查看
Handler中含有Looper和MessageQueue的引用,对应关系皆为1:1,一个Handler中只拥有与之对应的一个Looper或者MessageQueue。
Looper中包含一个MessageQueue和一个Thread,对应关系为1:1
MessageQueue是一个链表结构,用来存储Message对象.对应关系为1:N
Message中对应一个Handler对象,一般为msg.target =this ,由Handler发送消息时进行赋值,对应关系为1:1
Handler机制:
子线程通过获取Handler对象,让对象将数据发送给主线程的MessageQueue中,然后主线程中的Looper通过loop()方法不断的从消息队列中取出对象交给与之对应的Handler
进行处理。
非UI线程使用:
一个普通的线程是不包含Looper的,因此在非主线程中调用Handler对象发送消息的时候我们必须先调用Looper.prepare()方法,变成一个LooperThread对象,另外不可调用两次,否则产生异常,并且别忘了在最后调用Looper.loop()方法。
Message:
Android默认提供了一个消息池让我们获取Message对象,可直接使用Message.obtain()方法从消息池中获取一个Message对象,节约资源。
MessageQueue:
equeueMessage()方法将消息加入队列
next() 读取下一条消息
removeMessage() 删除消息
quit() 退出
注意:一般情况下为了不引起不必要的内存泄露,我们在Activity的onStop()方法中调用removeCallbacksAndMessage()方法清除。
Looper中包含一个MessageQueue和一个Thread,对应关系为1:1
MessageQueue是一个链表结构,用来存储Message对象.对应关系为1:N
Message中对应一个Handler对象,一般为msg.target =this ,由Handler发送消息时进行赋值,对应关系为1:1
Handler机制:
子线程通过获取Handler对象,让对象将数据发送给主线程的MessageQueue中,然后主线程中的Looper通过loop()方法不断的从消息队列中取出对象交给与之对应的Handler
进行处理。
非UI线程使用:
一个普通的线程是不包含Looper的,因此在非主线程中调用Handler对象发送消息的时候我们必须先调用Looper.prepare()方法,变成一个LooperThread对象,另外不可调用两次,否则产生异常,并且别忘了在最后调用Looper.loop()方法。
Message:
Android默认提供了一个消息池让我们获取Message对象,可直接使用Message.obtain()方法从消息池中获取一个Message对象,节约资源。
MessageQueue:
equeueMessage()方法将消息加入队列
next() 读取下一条消息
removeMessage() 删除消息
quit() 退出
注意:一般情况下为了不引起不必要的内存泄露,我们在Activity的onStop()方法中调用removeCallbacksAndMessage()方法清除。
相关文章推荐
- iOS-UITableView 设置分割线长度和颜色
- POJ 2299 Ultra-QuickSort 树状数组
- java web笔记——request&response
- [IOS 开发] NSOperationQueue常用方法
- Android学习笔记(40):SharedPreferences存储key-value对
- Android UI基础——ListView控件及Adapter适配器
- GradleUserGuide中文版 1)介绍 2)概述 3)教程 4)安装 5)故障 6)构建基础
- FZU 1894 志愿者选拔【单调队列】【monotone decreasing queue】
- [BS-03] 统一设置UITabBarController管理的所有VC的tabBarItem图标文字的颜色大小等属性
- UIImageView 点击放大缩小
- HDU 2604 Queuing(矩阵快速幂)
- HDU 2604 Queuing(矩阵快速幂)
- [置顶] UI设计资源收集
- 万恶的开源druid,去die
- Errors occurred during the build Errors running builder
- Android uiautomator 使用入门官方教程
- 算法Sedgewick第四版-第1章基础-1.3Bags, Queues, and Stacks-001可变在小的
- 触摸事件 - UIControlEvents
- VS 2008 Setup Project Build 出现 ERROR: Could not create the file,发现是Chrome 启服务Software Protection的导致。
- 关于fuel8的处理