#跟着坚果学鸿蒙#EventHandler 投递 Runnable 任务
·
#跟着坚果学鸿蒙#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;
更多推荐
所有评论(0)