#跟着坚果学鸿蒙#概述 在开发过程中,开发者经常需要在当前线程中处理下载任务等较为耗时的操作, 但是又不希望当前的线程受到阻塞。此时,就可以使用 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 

 

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐