Handler

我们知道,android是不允许在子线程中更新ui的,但是为了避免anr,我们有时候不得不在子线程中去执行一些耗时操作,然后根据这些耗时操作的执行结果来更新ui界面。对于这种情况,android提供了一套异步消息处理机制。

异步消息处理机制

四部分

Message

又称消息,在不同线程之间交换数据

Handler

发送(sendMessage方法)和处理(handlerMessage方法)消息

MessageQueue

又称消息队列,存放所有通过handler发送的消息

Looper

每个线程中MessageQueue的管家,在调用Looper的loop方法后,会进入一个无限循环,当这个循环发现MessageQueue中存在Message时,就会将其取出并传入Handler的handleMessage方法中进行处理

处理流程

  1. 创建handler对象,重写handlerMessage方法;
  2. 当子线程需要进行ui操作时,创建一个message对象,通过handler的sendMessage方法发送出去;
  3. 被发送的message进入消息队列,等待looper处理;
  4. looper会不断尝试获取消息队列中的内容,获取后会将消息发送回handler的handleMessage方法中处理

一个message经过上述流程后,就从子线程进入了主线程,从不能更新ui变成了可以。

为什么说handler是在主线程运行的?

当我们创建handler对象时,需要改写handlerMessage方法,而此方法就是在主线程中运行的。这就是为什么我们可以在这个方法中,放心地执行ui操作

你可能感兴趣的:(android)