#跟着坚果学鸿蒙#EventHandler 投递 Runnable 任务,并按照优先级和延时进行处理,开发步骤 如下: 1. 创建 EventHandler 的子类,创建 EventRunner,并创建 EventHandler 子类的实例,步骤与 EventHandler 投递 InnerEvent 场景的步骤 1-3 相 同。 2. 创建 Runnable 任务。

Runnable task1 = new Runnable() { 
 @Override 
 public void run() { // 待执行的操作,由开发者定义 
 } 
}; 
Runnable task2 = new Runnable() { 
 @Override 
 public void run() { 
 // 待执行的操作,由开发者定义 
 } 
}; 

投递Runnable任务,投递的优先级以IMMEDIATE为例,延时选择0ms和2ms。

//优先级为 immediate,延时 0ms,该语句等价于同步投递
myHandler.postSyncTask(task1,EventHandler.Priority.immediate); 
myHandler.postTask(task1,0, EventHandler.Priority.IMMEDIATE); 
 
myHandler.postTask(task2,2, EventHandler.Priority.IMMEDIATE);// 延时 2ms
后立即执行 

启动和停止 EventRunner,如果是托管模式,则不需要此步骤。

runner.run(); 
//待执行操作 
 
runner.stop();// 停止 EventRunner 

在新创建的线程里投递事件到原线程

EventHandler 从新创建的线程投递事件到原线程并进行处理,开发步骤如下: 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; 
 Object object = event.object; 
 switch (eventId | param) { 
 case CASE1: 
 // 待执行的操作,由开发者定义 
 break; 
 case CASE2: // 将原先线程的 EventRunner 实例投递给新创建的线程 
 if (object instanceof EventRunner) { 
 EventRunner runner2 = (EventRunner)object; 
 } 
 // 将原先线程的 EventRunner 实例与新创建的线程的
EventHandler 绑定 
 EventHandler myHandler2 = new EventHandler(runner2) { 
 @Override 
 public void processEvent(InnerEvent event) { //需要在原先线程执行的操作 
 } 
 }; 
 int eventId = 1; 
 long param = 0; 
 Object object = null; 
 InnerEvent event2 = InnerEvent.get(eventId, param, 
object); 
 myHandler2.sendEvent(event2); // 投递事件到原先的线程 
 break; 
 default: 
 break; 
 } } 
} 

创建 EventRunner,以手动模式为例。

EventRunner runner1 = EventRunner.create(false);// create()的参数是 true
时,则为托管模式。 
// 需要对 EventRunner 的实例进行校验,不是任何线程都可以通过 create 创建,例如:
当线程池已满时,不能再创建线程。 
if (runner1 == null) { 
 return; 
} 

创建 EventHandler 子类的实例。

MyEventHandler myHandler1 = new MyEventHandler(runner1); 

获取 InnerEvent 事件。

// 获取事件实例,其属性 eventId, param, object 由开发者确定,代码中只是示例。 
int eventId1 = 0; 
long param = 0; 
Object object = (Object) EventRunner.current(); 
InnerEvent event1 = InnerEvent.get(eventId1, param, object); 

投递事件,在新线程上直接处理。

// 将与当前线程绑定的 EventRunner 投递到与 runner1 创建的新线程中 
 myHandler.sendEvent(event1); 

启动和停止 EventRunner,如果是托管模式,则不需要此步骤。

runner.run(); 
//待执行操作 
 
runner.stop();// 停止 EventRunner 

完整代码示例 • 非托管情况:

//全局: 
EventRunner runnerA 
 
//线程 A: 
runnerA = EventRunner.create(false); 
runnerA.run(); // run 之后一直循环卡在这里,所以需要新建一个线程 run 
 
//线程 B: //1.创建类继承 EventHandler 
public class MyEventHandler extends EventHandler { 
 public static int CODE_DOWNLOAD_FILE1; 
 public static int CODE_DOWNLOAD_FILE2; 
 public static int CODE_DOWNLOAD_FILE3; 
 private MyEventHandler(EventRunner runner) { 
 super(runner); 
 } 
 
 @Override public void processEvent(InnerEvent event) { 
 super.processEvent(event); 
 if (event == null) { 
 return; 
 } 
 
 int eventId = event.eventId; 
 if (STOP_EVENT_ID != eventId) { 
 resultEventIdList.add(eventId); 
 } 
 switch (eventId) { 
 case CODE_DOWNLOAD_FILE1: { 
 ... // your process 
 break; 
 } 
 case CODE_DOWNLOAD_FILE1: { 
 ... // your process break; 
 } 
 case CODE_DOWNLOAD_FILE1: { 
 ... // your process 
 break; 
 } 
 default: 
 break; 
 } 
 } 
} //2.创建 MyEventHandler 实例 
MyEventHandler handler = new MyEventHandler(runnerA); 
 
// 3.向线程 A 发送事件 
handler.sendEvent(CODE_DOWNLOAD_FILE1); 
handler.sendEvent(CODE_DOWNLOAD_FILE2); 
handler.sendEvent(CODE_DOWNLOAD_FILE3); 
...... 
 
// 4.runnerA 不再使用后,退出 
runnerA.stop(); 

托管情况:

//1.创建 EventRunner A: 
EventRunner runnerA = EventRunner.create("downloadRunner"); // 内部会新建
一个线程 //2.创建类继承 EventHandler 
public class MyEventHandler extends EventHandler { 
 public static int CODE_DOWNLOAD_FILE1; 
 public static int CODE_DOWNLOAD_FILE2; 
 public static int CODE_DOWNLOAD_FILE3; 
 private MyEventHandler(EventRunner runner) { 
 super(runner); 
 } 
 
 @Override 
 public void processEvent(InnerEvent event) { 
 super.processEvent(event); 
 if (event == null) { return; 
 } 
 
 int eventId = event.eventId; 
 if (STOP_EVENT_ID != eventId) { 
 resultEventIdList.add(eventId); 
 } 
 
 switch (eventId) { 
 case CODE_DOWNLOAD_FILE1: { 
 ... // your process 
 break; 
 } case CODE_DOWNLOAD_FILE1: { ... // your process 
 break; 
 } 
 case CODE_DOWNLOAD_FILE1: { 
 ... // your process 
 break; 
 } 
 default: 
 break; 
 } 
 } 
} //3.创建 MyEventHandler 实例 
MyEventHandler handler = new MyEventHandler(runnerA); 
 
//4.向线程 A 发送事件 
handler.sendEvent(CODE_DOWNLOAD_FILE1); 
handler.sendEvent(CODE_DOWNLOAD_FILE2); 
handler.sendEvent(CODE_DOWNLOAD_FILE3); 
...... 
 
//5.runnerA 没有任何对象引入时,线程会自动回收 
runnerA = null; 

 

Logo

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

更多推荐