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和当前的线程关联