Handler
handler发送消息(send message)不是直接发送给线程的,先是发送给队列(Message Queue),队列里面有个拿东西的角色,我们称之为looper,而且looper是一个循环的东西,只要队列里面有东西,looper就不停的从里面拿东西,在looper拿到东西之后,会把拿到的东西回传给handler,在handler拿到东西之后,会执行一个处理处理消息的方法,我们称之为HandlerMessage
竟然回回传消息,我们为什么不直接向子线程发送消息呢,打个比如说,我们直接往子线程发送消息的话,只会不断的发送消息,假如说有回信,我们是无法收到通知的,这个时候就需要一个中转站,当有回信的时候,会通知我们,然后在进行处理
举例子说明
假如我要给朋友寄信,这个时候需要邮箱,而邮箱的角色相当于MessageQueue,而邮寄员的角色相当于looper只要我往邮箱里面放入信件,他就不断的去拿信件,然后寄给我的朋友,当我朋友进行回件的时候,这时候邮寄员回重新从MessageQueue拿信件回寄给我,而我会通过各种形式去处理这个信件比如拆开看,销毁,而处理的方法就是HandlerMessage
使用场景
像ui线程只能在主线程进行,我们可以理解为ui线程等于主线程
你像我们在实际开发中会存在多个线程并发操作UI组件的情况,这样会导致UI操作的线程不安全,这个时候我们使用handler,工作线程需要更新UI组件的时候,我们可以通过handler通知主线程,从而在主线程更新UI操作
activity内存泄漏
handler是允许我们做延迟操作的,如果在延迟期间用户就关闭了activity,这样会导致activity内存泄漏,内存泄漏原因是因为,message是持有handler,java有个特征就是内部类持有外部类,也就是说,handler持有activity,那么你虽然关闭了activity,但是handler仍然持有activity
解决方案,变成静态类+轻引用,也就是说静态内部类是不持有外部类的