Handler的原理

Handler的原理:子线程中将Message发送给主线程,主线程接收Message,并进行处理

其中使用handler过程中 涉及到3个对象

Message:一个消息对象 ,主要在子线程中吧绑定的数据,携带到主线程

MessageQueue:住县城里面的消息队列,接受子线程发来的Message对象(是内部执行的,不可见的);

Looper:消息循环器,不断的从messagequeue中取出一个个messages对象(采用的是冒泡法一样的取出,而不是遍历) 交给handler内部处理(内部执行)

Handler和message,looper之间的关系,message发送消息到消息队列Looper取消息给handler.

handler创建太多的时候会导致应用崩溃,真正实际开发中用处不大

实际开发中都是用的eventbus 因为开发效率高    但是handler是基石      安卓可以没有eventbus     但是没有handler不行




Meaasge的创建

开发中不用    有很多activiyty    每次发送消息到主线程   随着安卓体系越来越冗余 功能越来越庞大  线程与线程之间进行通讯的频率越累越多导致

message也越来越多  如果每用一次都要创建message对象   内存就爆了

2.3以前 无所谓  可以new  4.0以后功能  方法越来越多  很多功能都需要线程通讯在内存运行时间 长就会崩掉了

Message msg=new Message();

静态方法创建message

实际上就开启了message的复用

核心就是使用一个临时的message类型变量,来进行地址之间的传递

obtain有七个重载方法  调用的那个空参数的方法 其中6个调来调去也是调用了空参数的方法

Message.obtain();

从源码看里边有一个同步锁  有一个判断   在这个recycle复用机制   里面有 meaasge 对象 就用复用机制里面的  没有的话就创建使用完之后再回收下次继续使用

用handler对象调用message 创建messag对象 和第二种一样

服用了recycle 的复用机制

handler.obtainMessage();

怎么一个个复用Message对象的呢??

Message









Looper的原理
 Lopper(1.0 Looper是死循环  2.0 Looper是主线程)
 handler的创建 直接new出来 有多个重载方法  但是核心是一个无参
 一个传Looper的有参方法每一个handler有自己的Loope对象
 但是这个Looper对象不是new出来的而是通过(get)获取app里面唯一的looper  而系统的唯一的looper 他是app一启动通过ThreadMain类里面的Main方法里面创建的Looper
 但是所有的looper地址值都指向同一个Looper(映射)
 app一创建系统就创建了一个looper(Looper.looper(把loope运行起来)
 Looper.prepare(创建一个looper对象)
 出来的)
 自定义一个handler
 一个是无参数的  一个是有参的 里面需要传一个looper
 messagequeue其实是在Looper里面的
 Looper内部死一个死循环 任何的操作点击按钮
 代码卡在whiletrue里面
 当把消息处理完的时候会调用recycle将消息放到复用机制里面
 api15之前是while(4.0)之前
 4.0之后是for(;;)的死循环
 当looper处于闲置状态的时候,会沉睡,减少cpu的资源消耗(管道流机制  以一个流(字节码)的形式存在内存中   是一个无实体的文件)


在子线程创建handler
Looper.prepare();
Handler handler=new Handler();
Looper.preprare();

主线程就是Looper looper就是主线程
app的启动会执行那些
1 ActivityThread 类
2  Main 方法
3  preparemainlooper方法(把loope运行起来)
4 prepare()方法(创建looper对象)
5 在looper内部创建了MessageQueue 使该Looper和当前的线程关联

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值