在学习Handler之前,我们先弄懂两个概念。一个是进程,一个是线程。进程就是程序运行时在内存中开辟的一个内存空间。而线程则是进程执行任务时的最小单元,分为主线程(负责更新UI)和子线程(执行耗时操作)。
一、为什么学习Handler
1.在每一个Android应用启动时,这个应用会启动一个UI线程(主线程)。2.只有在UI线程里才可以对控件、布局进行获取或设置。3.在Android设置思想中为了确保流畅的操作体验,一些耗时的任务不能够在UI线程中运行。4.如果UI线程花较多时间处理耗时操作(一般是5秒左右),让用户等待时间超过5秒而未处理Android系统会提示ANR提示信息。
Android中的异步消息处理主要由4部分组成:Message、Handler、MessageQueue和Looper。
二、什么是Handler
Handler是Android SDK 中处理异步消息的核心类。
Handler的作用是让子线程通过与UI线程通信来更新UI界面。
运行机制:
1.创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来
2.当我们在线程中处理完数据后,可以通过Handler对象将消息发出。
Message
Message是在线程之间传递的消息,他可以在内部携带少量的信息,用于在不同线程之间交换数据Message有What字段、arg1和arg2字段携带一些整型数据和obj字段携带一个Object对象,
What属性 | arg1、arg2属性 | obj属性 |
int类型的消息码,接受方用来识别是什么消息 | int类型,如果传递的消息仅仅是整型数字,可以将数字赋给arg1或arg2 | Object类型,如果传递的消息是String或任意类型时,可将数据赋给obj属性 |
MessageQueue
MessageQueue是消息队列的意思。它主要用于存放所有通过Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个MessageQueue对象。
Looper
Looper是每个线程中的MessageQueue的管家。调用Looper的loop()方法后,就会进入到一个无线循环当中,然后每当发现MessageQueue中存在一条消息,就会将它取出,并传递到Handler的handleMessage()方法中,每个线程中也只会有一个Looper对象。
三、使用Handler的步骤
1.在UI线程中创建Handler匿名内部类对象
2.在匿名内部类中重写handleMessage方法
3.在UI线程中启动子线程
4.在线程中获得Message对象
5.将需要传递的数据赋值到Message对象中
6.通过Handler对象的sendMessage方法发送消息到消息列队
7.在handMessage方法中接受消息
Handler对象的常用方法
方法名 | 解释 |
sendEmptyMessage() | 发送消息,消息内容是int类型 |
sendMessage() | 发送消息,消息内容是Message类型 |
obtainMesage() | 从消息池中获得一个Message对象,sednMeaage是发出此Message |
post() | 将Runnable对象放入线程队列,不建议使用,post方法运行在UI线程中,耗时操作将阻塞UI线程 |
postDelayed() | 延迟多久后,将Runnable对象放入线程队列,不建议使用,post方法运行在UI线程中,耗时操作将阻塞UI线程 |