在Android中,Handler的主要作用是实现线程之间的通信和处理异步任务。用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message。
Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信。可以说只要有异步线程与主线程通信的地方就一定会有 Handler。
Handler原理
在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。
使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全。
Handler的基本用法
在主线程中使用Handler
在主线程中使用Handler,可以直接使用getMainLooper()获取主线程Looper对象,并创建Handler实例。例如,在Activity中实现在子线程中更新UI:
new Thread(new Runnable() {@Overridepublic void run() {// 子线程中进行耗时操作...// 完成后在主线程中更新UImHandler.post(new Runnable() {@Overridepublic void run() {// UI更新代码}});}
}).start();
在子线程中使用Handler
在子线程中更新UI,需要将当前线程的Looper对象关联给Handler实例,以便于在消息队列中执行此消息。
new Thread(new Runnable() {@Overridepublic void run() { 在子线程中进行耗时操作...Message message = mHandler.obtainMessage(MSG_ID, arg1, arg2);mHandler.sendMessage(message);}
}).start();mHandler = new Handler(new Handler.Callback() {@Overridepublic boolean handleMessage(Message msg) {switch (msg.what) {case MSG_ID:// UI更新代码return true;default:return false;}}
});
Handler常见任务
3.1 延迟执行任务
使用Handler.postDelayed()方法可将消息延迟一段时间后再发送到消息队列中。例如:
mHandler.postDelayed(new Runnable() {@Overridepublic void run() {//执行延迟任务}
}, DELAY_MILLIS);
3.2 周期性执行任务
使用Handler.postDelayed()方法和Handler.sendMessage()方法结合,可实现周期性执行任务的功能。
mHandler.postDelayed(new Runnable() {@Overridepublic void run() {// 周期性执行任务mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_ID), INTERVAL);}
}, DELAY_MILLIS);
3.3 多任务按顺序执行
多任务按顺序串行运行,可以利用消息队列处理多个消息。
mHandler.sendMessage(Message.obtain(mHandler, TASK1_ID, arg1, arg2));
mHandler.sendMessage(Message.obtain(mHandler, TASK2_ID, arg1, arg2));
mHandler.sendMessage(Message.obtain(mHandler, TASK3_ID, arg1, arg2));
在Handler的handleMessage()方法中分别处理每个消息。
Handler调用方式的异同
使用Handler,有两种方法将消息加入消息队列中:post()方法和sendMessage()方法。两种方法的异同如下:
4.1 同异步方式
- post()方法是同步方式。即加入消息到消息队列中后,会直接处理此消息,不必等待消息阻塞的处理程序返回。
- sendMessage()方法是异步方式。即加入消息到消息队列中后,不会立即执行此消息,而是等待消息阻塞的处理程序返回。
4.2 方法参数
- post()方法的参数是Runnable对象,而Runnable对象中run()方法是待执行的任务代码。
- sendMessage()方法的参数是Message对象,而Message对象中的what字段是消息ID,arg1和arg2是可传递给处理程序的参数。
4.3 延迟时间参数
- postDelayed()方法是将Runnable对象放入到消息队列中,延迟指定时间执行,其第二个参数为DelayMillis。而post()方法不支持延迟时间参数。
- sendMessageDelayed()方法是将Message对象放入到消息队列中,延迟指定时间执行,其第二个参数为DelayMillis。而sendMessage()方法不支持延迟时间参数。
本文主要是讲述了在Android开发中Handler的技术重要性,有关Handler的技术内容还有以下内容摘要↓↓↓ :link.juejin.cn/?target=htt…
- Handler机制之AsyncTask源码解析
- Handler机制之Callable、Future和 FutureTask
- Handler机制
- Handler机制之looper与handle
- Handler机制之MessageQueue
- Handler机制之Message简介与消息对象
- Handler机制之Native的实现
- Handler机制之Thread
- Handler机制之ThreadLocal
- Handler机制之消息发送
- Handler机制之loop机制
最后总结
Handler是Android系统的核心组件,在线程与消息传递中发挥着重要的作用。它可以帮助用户在不同的线程中实现消息的传递和任务的执行,并且提供了许多具有实际用途的方法。
使用Handler最根本的目的就是为了解决多线程并发的问题,Android给我们提供这一套更新UI的机制我们只需要遵循这种机制就行了。不用再去关系多线程的问题,所有的更新UI的操作,都是在主线程的消息队列中去轮训的。 它把消息发送给Looper管理的MessageQueue,并负责处理Looper分发给他的消息。