Handler学习
Handler的作用
1.执行计划任务,你可以在预定的实现执行某些任务,可以模拟定时器
2.线程间通信。在Android的通信启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其他线程中更新界面。
Looper的实现:
当前线程有一个Looper这样的循环在监听消息队列,这是一个死循环,主线程好像可以不用管Looper,其他逻辑代码可以照常往下走,但这个又不是而外的线程,这不是和我们学习的常理相悖么?
Looper由系统控制的循环。在我们的线程没有新开,但是在系统里面vm会有
角色描述:
1.Looper:(相当于隧道)一个线程可以产生一个Looper对象,由他来管理此线程里的MessageQueue
2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里,或者接收从Looper(从MessageQueue取出)所送来的消息
3.MessageQueue:(消息队列)用来存放线程放入的消息
4.线程:UI thread通常就是main thread,而Android启动程序时会替他建立一个MessageQueue
主线程就一个消息队列,不同handler实例之间不能共享消息
HandlerThread子线程的Handler可以使用子线程的消息队列
Handler操作队列,主要是在子线程操作主线程的消息队列,子线程默认是没有消息队列的
Handler是在主线程内的么?
一般是在主线程里面,但是可以控制在当前线程里面发送接受
Handler的post和sendMessage方法,使用的是一个队列还是两个队列?使用的是一个队列
子线程中建立一个handler,然后sendMessage会怎样?
默认的情况下会抛异常,如果在子线程中实例化了looper,可以正常操作
子线程建立handler,构造的时候传入主线程的Looper?
是可以的