2019-05-05

简单介绍handler

handler的概念:handler是给我们提供用来更新UI的机制,也是一套消息处理机制,我们可以发送消息,也可以处理消息。

handler的作用:因为在Android中,主线程不建议做耗时操作,子线程比建议更新UI,但是Android开发,其实就是搭建好页面,将服务器的数据展示到页面上,所以使用网络请求会非常频繁,而网络请求属于耗时操作,需要放在子线程完成,但一般情况下也不会通过子线程更新UI,需要将请求成功的数据发送到主线程进行UI更新,所以一般会使用到handler。

Handler执行流程:首先handler作为任务执行者,一般创建在主线程,当子线程有需要发送的数据,通过创建message对象,使用handler对象将消息发送到messagequeue,messagequeue遵循了队列先进先出的原则,当主线程的looper循环消息的时候,会按照messagequeue队列的顺序循环消息,并将消息给到任务执行者handler去执行任务。

Handler执行原理:Handler创建完成后,内部的Looper以及MessageQueue就可以和Handler一起协同工作,然后通过Hadler的post方法将一个Runnable投递到Handler内部的Looper中去处理,也可以通过Handler的send方法发送一个消息,这个消息会在Looper中做处理。Post最终也是通过send来完成的。当Handler的send方法被调用时,他会调用MessageQueue的enqueueMessage方法将这个消息放入消息队列中,然后Looper发现有新消息到来时,就会处理这个消息,最终消息中的Runnable或者Handler的handlerMessage方法就会被调用。Looper是运行在Handler所在的线程,所以就把业务逻辑切换到主线程了

对于ThreadLocal和HandlerThread的介绍

ThreadLocal

定义:ThreadLocal是线程内部的数据存储类,通过他可以在指定的线程中存储数据,该数据只有在指定线程中可以获取

使用场景:当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候另外还可以使用在复杂逻辑下的对象传递。


HandlerThread

handlerThread设计方面比较高效快捷,它帮你把任务的发送,处理都封装了起来,包括帮你封装了Looper对象,不需要再手动创建。而Thread则不行。handlerThread解决了同步问题,在主线程创建此类并且获取子线程的hanlder对象,不会报空指针。

因为源码里帮这个线程提升了优先级。

你可能感兴趣的:(2019-05-05)