Android中Handler很重要吗?为什么要学

在Android中,Handler的主要作用是实现线程之间的通信和处理异步任务。用最简单的话描述: handler其实就是主线程在起了一个子线程,子线程运行并生成Message,Looper获取message并传递给Handler,Handler逐个获取子线程中的Message。

Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信。可以说只要有异步线程与主线程通信的地方就一定会有 Handler。

Handler原理

在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理。

Android中Handler很重要吗?为什么要学_第1张图片

使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全。

Android中Handler很重要吗?为什么要学_第2张图片

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…

  1. Handler机制之AsyncTask源码解析
  2. Handler机制之Callable、Future和 FutureTask
  3. Handler机制
  4. Handler机制之looper与handle
  5. Handler机制之MessageQueue
  6. Handler机制之Message简介与消息对象
  7. Handler机制之Native的实现
  8. Handler机制之Thread
  9. Handler机制之ThreadLocal
  10. Handler机制之消息发送
  11. Handler机制之loop机制

Android中Handler很重要吗?为什么要学_第3张图片

最后总结

Handler是Android系统的核心组件,在线程与消息传递中发挥着重要的作用。它可以帮助用户在不同的线程中实现消息的传递和任务的执行,并且提供了许多具有实际用途的方法。

使用Handler最根本的目的就是为了解决多线程并发的问题,Android给我们提供这一套更新UI的机制我们只需要遵循这种机制就行了。不用再去关系多线程的问题,所有的更新UI的操作,都是在主线程的消息队列中去轮训的。 它把消息发送给Looper管理的MessageQueue,并负责处理Looper分发给他的消息。

你可能感兴趣的:(Android,开发,Handler,android,程序员,开发,Android开发,handle,面试)