#跟着坚果学鸿蒙#线程间通信
#跟着坚果学鸿蒙#概述 在开发过程中,开发者经常需要在当前线程中处理下载任务等较为耗时的操作, 但是又不希望当前的线程受到阻塞。此时,就可以使用 EventHandler 机制。 EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制,可以通过 EventRunner 创建新线程,将耗时的操作放到新线程上执行。这样既不阻塞原来 的线程,任务又可以得到合理的处理。比如:主线程使用 EventHandler 创建子线 程,子线程做耗时的下载图片操作,下载完成后,子线程通过 EventHandler 通知 主线程,主线程再更新 UI。
基本概念 EventRunner 是一种事件循环器,循环处理从该 EventRunner 创建的新线程的事 件队列中获取 InnerEvent 事件或者 Runnable 任务。InnerEvent 是 EventHandler 投递的事件。 EventHandler是一种用户在当前线程上投递InnerEvent事件或者Runnable任务到 异步线程上处理的机制。每一个 EventHandler 和指定的 EventRunner 所创建的新 线程绑定,并且该新线程内部有一个事件队列。EventHandler 可以投递指定的 InnerEvent 事件或 Runnable 任务到这个事件队列。EventRunner 从事件队列里循 环地取出事件,如果取出的事件是 InnerEvent 事件,将在 EventRunner 所在线程 执行 processEvent 回调;如果取出的事件是 Runnable 任务,将在 EventRunner 所在线程执行 Runnable 的 run 回调。一般,EventHandler 有两个主要作用: ⚫ 在不同线程间分发和处理 InnerEvent 事件或 Runnable 任务。 ⚫ 延迟处理 InnerEvent 事件或 Runnable 任务。
运作机制 EventHandler 的运作机制如下图所示:
使用 EventHandler 实现线程间通信的主要流程: 1. EventHandler 投递具体的 InnerEvent 事件或者 Runnable 任务到 EventRunner 所创建 的线程的事件队列。 2. EventRunner 循环从事件队列中获取 InnerEvent 事件或者 Runnable 任务。 3. 处理事件或任务: ⚫ 如果 EventRunner 取出的事件为 InnerEvent 事件,则触发 EventHandler 的回 调方法并触发 EventHandler 的处理方法,在新线程上处理该事件。 ⚫ 如果 EventRunner 取出的事件为 Runnable 任务,则 EventRunner 直接在新线 程上处理 Runnable 任务。
约束限制 ⚫ 在进行线程间通信的时候,EventHandler 只能和 EventRunner 所创建的线程 进行绑定,EventRunner 创建时需要判断是否创建成功,只有确保获取的 EventRunner 实例非空时,才可以使用 EventHandler 绑定 EventRunner。 ⚫ 一个 EventHandler 只能同时与一个 EventRunner 绑定,一个 EventRunner 上 可以创建多个 EventHandler。
开发指导 场景介绍 EventHandler 开发场景 EventHandler的主要功能是将InnerEvent事件或者Runnable任务投递到其他的线 程进行处理,其使用的场景包括: ⚫ 开发者需要将 InnerEvent 事件投递到新的线程,按照优先级和延时进行处理。 投递时,EventHandler 的优先级可在 IMMEDIATE、HIGH、LOW、IDLE 中选择,并 设置合适的 delayTime。 ⚫ 开发者需要将 Runnable 任务投递到新的线程,并按照优先级和延时进行处 理。投递时,EventHandler 的优先级可在 IMMEDIATE、HIGH、LOW、IDLE 中选择, 并设置合适的 delayTime。 ⚫ 开发者需要在新创建的线程里投递事件到原线程进行处理。 EventRunner 工作模式 EventRunner 的工作模式可以分为托管模式和手动模式。两种模式是在调用 EventRunner 的 create()方法时,通过选择不同的参数来实现的,详见 API 参考。 默认为托管模式。 ⚫ 托管模式:不需要开发者调用 run()和 stop()方法去启动和停止 EventRunner。 当 EventRunner 实例化时,系统调用 run()来启动 EventRunner;当 EventRunner 不被引用时,系统调用 stop()来停止 EventRunner。 ⚫ 手动模式:需要开发者自行调用 EventRunner 的 run()方法和 stop()方法来确 保线程的启动和停止。
接口说明 EventHandler ⚫ EventHandler 的属性 Priority(优先级)介绍:
EventRunner 将根据优先级的高低从事件队列中获取事件或者 Runnable 任务进 行处理。
⚫ EventHandler 的主要接口介绍:
EventRunner • EventRunner 的主要接口介绍:
InnerEvent • InnerEvent 的属性介绍:
• InnerEvent 的主要接口介绍:
开发步骤 EventHandler 投递 InnerEvent 事件 EventHandler 投递 InnerEvent 事件,并按照优先级和延时进行处理,开发步骤如 下: 1. 创建 EventHandler 的子类,在子类中重写实现方法 processEvent()来处理事件。
private class MyEventHandler extends EventHandler {
private MyEventHandler(EventRunner runner) {
super(runner);
}
// 重写实现 processEvent 方法
@Override
public void processEvent(InnerEvent event) {
super.processEvent(event);
if (event == null) { return;
}
int eventId = event.eventId; long param = event.param;
switch (eventId | param) {
case CASE1:
// 待执行的操作,由开发者定义
break;
default:
break;
}
}
}
创建 EventRunner,以手动模式为例。
EventRunner runner = EventRunner.create(false);// create()的参数是 true 时,
则为托管模式
// 需要对 EventRunner 的实例进行校验,因为创建 EventRunner 可能失败,如创建线程
失败时,创建 EventRunner 失败。
if (runner == null) {
return;
}
创建 EventHandler 子类的实例。
MyEventHandler myHandler = new MyEventHandler(runner);
获取 InnerEvent 事件。
// 获取事件实例,其属性 eventId, param, object 由开发者确定,代码中只是示例。
int eventId1 = 0;
int eventId2 = 1;
long param = 0; Object object = null;
InnerEvent event1 = InnerEvent.get(eventId1, param, object);
InnerEvent event2 = InnerEvent.get(eventId2, param, object);
投递事件,投递的优先级以 IMMEDIATE 为例,延时选择 0ms 和 2ms。
// 优先级 immediate,投递之后立即处理,延时为 0ms,该语句等价于同步投递
sendSyncEvent(event1,EventHandler.Priority.immediate);
myHandler.sendEvent(event1, 0, EventHandler.Priority.IMMEDIATE);
myHandler.sendEvent(event2, 2, EventHandler.Priority.IMMEDIATE); // 延时
2ms 后立即处理
启动和停止 EventRunner,如果为托管模式,则不需要此步骤。
runner.run();
//待执行操作
runner.stop();// 开发者根据业务需要在适当时机停止 EventRunner
更多推荐
所有评论(0)