Android Handler机制简述(一)
来源:互联网 发布:大中华帝国史 淘宝 编辑:程序博客网 时间:2024/04/27 06:16
最近一直在看Android,在写UI和网络的时候,多次遇到Handler这种东西,于是乎想深入的了解一下Handler,但开始看了才发现,它并没有那么简单,而且这个知识点又非常的重要,所以我打算把我学到的东西写下来,也算是一种巩固,这是我第一次写博客,参考了其他人写的一些知识点,技术也很不成熟,有问题也需要大家来指正。
Handler主要应用在多线程之中,用的是Thread和Runnable,Java使用多线程的情况主要有三点:1.I/O操作2.复杂的运算3.计时操作。而多线程非常需要注意的就是线程安全问题,在Java程序中,我们用Lock和Synchronized来保证线程安全,而在Android中,谷歌提供了一个非常好的方法,那就是Handler,大大简化了线程安全的操作。举个例子,Handler用的最多的就是我们如果在子线程中改变UI界面,会造成线程安全问题导致程序崩溃,这个时候,就需要子线程通过Handler将信息传给UI线程简介改变UI。那么为什么不直接在UI线程改变呢,这是因为,如果改变UI的操作时间过长会造成界面“卡死”的现象,影响用户体验。
每个线程都会产生一个Looper对象,负责Handler和Message Queue的交互,Message queue负责储存传入的Message并按先后顺序传递给Looper,这也保证了不会造成线程冲突,Looper由于是一个死循环,所以,他的作用就是源源不断的将消息队列中的Message获取到并发送给Handler,相当一个中间桥梁,也是Handler实现的核心。
接下来是Handler涉及到的多个问题。
一、同一个HandlerThread可以有多个Handler,并且这两个Handler不会互相混淆。
二、Handler并不是可以创建到任意线程,必须是有调用过Looper.prepare()的HandlerThread才可以,继承HandlerThread的子类都必须默认重写onLooprPrepare()方法才可以创建线程安全的Handler对象。如果不想写一个继承HandlerThread的内部类在类中创建Handler,那么在子线程中创建Handler的时候,需要给它一个参数参数为一个抽象类,需要重写它的方法Handler handler = new Handler(Looper.getMainLooper{
这样就可以使用主线程的Looper,主线程已经默认调用了Looper.Prepare(),或者使用(new HandlerThread).getLooper调用创建Handler线程的Looper,除此之外还有一种方法就是在创建Handler之前,首先认为的调用一下Looper.Prepare(),并且在最后调用Looper.loop()以保证Looper从Message Queue中源源不断的取出Message。
@Override
public void handleMessage(Message msg){
}});
三、同一个Handler接收到的Message不会出现交叉,只有一条执行完,才会执行下一条。
四、有的时候,一条Message被发送了好多次,但只需要它相应依次就好,那么就要调用HandlerThread的removeMessage()方法,删掉除正在进行的Message以外的其他所有Message。这个方法并不会中断当前Message的执行。
待续。。。。。。
- Android Handler机制简述(一)
- Android Handler消息机制简述
- Android中的Handler机制(一)
- Android 消息机制--Handler运行机制(一)
- Android消息机制-Handler(一)
- 简述Handler机制
- Handler 机制(一)
- 简述下handler分发机制
- Android--Handler机制(一)(Android Studio)
- Android 中消息处理机制-Looper、Handler、Thread(一)
- Android Handler的机制和原理(一)
- Android Handler类消息传递机制(一)介绍
- Android的消息机制学习(一)Looper,Handler,MessageQueue
- android源码分析系列(一):Handler机制
- Android 中消息处理机制-Looper、Handler、Thread(一)
- Android 源码解析Handler处理机制(一)
- Handler 机制初步(一)
- 【Android】Handler机制源码详解(一)
- Java反射机制(Reflection)
- coreseek 大数据联表建立索引速度慢的解决办法
- 【IOS 开发学习总结-OC-36】★文件 I/O——NSFileHandle&NSURL&NSBundle
- 指定某个cpu只运行指定进程的做法
- Unity学习笔记--鹰击长空类固定视角游戏摄像机跟随
- Android Handler机制简述(一)
- Notification案例
- NYOJ 32 组合数 (深搜DFS)
- 文章标题
- View.scrollBy()与View.scrollTo()的使用
- 排序_简单选择排序
- A020-列表容器之ListView
- leetcode题目 全排列(三种解法)
- 网页中微软雅黑字体调用