当前位置: 首页 > news >正文

门店做网站有没有必要做公众号排版的网站

门店做网站有没有必要,做公众号排版的网站,如何评价一个网站做的是否好,数字营销实训报告鸿蒙OS 线程间通信概述 在开发过程中#xff0c;开发者经常需要在当前线程中处理下载任务等较为耗时的操作#xff0c;但是又不希望当前的线程受到阻塞。此时#xff0c;就可以使用 EventHandler 机制。EventHandler 是 HarmonyOS 用于处理线程间通信的一种机制#xff0c…鸿蒙OS 线程间通信概述 在开发过程中开发者经常需要在当前线程中处理下载任务等较为耗时的操作但是又不希望当前的线程受到阻塞。此时就可以使用 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 实现线程间通信的主要流程 EventHandler 投递具体的 InnerEvent 事件或者 Runnable 任务到 EventRunner 所创建的线程的事件队列。 EventRunner 循环从事件队列中获取 InnerEvent 事件或者 Runnable 任务。 处理事件或任务 如果 EventRunner 取出的事件为 InnerEvent 事件则触发 EventHandler 的回调方法并触发 EventHandler 的处理方法在新线程上处理该事件。 如果 EventRunner 取出的事件为 Runnable 任务则 EventRunner 直接在新线程上处理 Runnable 任务。约束限制 在进行线程间通信的时候EventHandler 只能和 EventRunner 所创建的线程进行绑定EventRunner 创建时需要判断是否创建成功只有确保获取的 EventRunner 实例非空时才可以使用 EventHandler 绑定 EventRunner。 一个 EventHandler 只能同时与一个 EventRunner 绑定一个 EventRunner 上可以创建多个 EventHandler。 鸿蒙OS 线程间通信开发指导 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 事件并按照优先级和延时进行处理开发步骤如下 创建 EventHandler 的子类在子类中重写实现方法 processEvent() 来处理事件。private class MyEventHandler extends EventHandler {private MyEventHandler(EventRunner runner) {super(runner);}// 重写实现processEvent方法Overridepublic 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(event1EventHandler.Priority.immediate);myHandler.sendEvent(event1, 0, EventHandler.Priority.IMMEDIATE);myHandler.sendEvent(event2, 2, EventHandler.Priority.IMMEDIATE); // 延时 2ms 后立即处理启动和停止 EventRunner如果为托管模式则不需要此步骤。 runner.run();//待执行操作runner.stop();// 开发者根据业务需要在适当时机停止 EventRunnerEventHandler 投递 Runnable 任务 EventHandler 投递Runnable 任务并按照优先级和延时进行处理开发步骤如下 创建 EventHandler 的子类创建 EventRunner并创建 EventHandler 子类的实例步骤与[ EventHandler 投递 InnerEvent] 场景的步骤1-3相同。 创建 Runnable 任务。 Runnable task1 new Runnable() {Overridepublic void run() {// 待执行的操作由开发者定义}};Runnable task2 new Runnable() {Overridepublic void run() {// 待执行的操作由开发者定义}};投递 Runnable 任务投递的优先级以 IMMEDIATE 为例延时选择 0ms 和 2ms。 //优先级为 immediate延时 0ms该语句等价于同步投递myHandler.postSyncTask(task1EventHandler.Priority.immediate);myHandler.postTask(task10 EventHandler.Priority.IMMEDIATE);myHandler.postTask(task22 EventHandler.Priority.IMMEDIATE);// 延时2ms后立即执行启动和停止 EventRunner如果是托管模式则不需要此步骤。 runner.run();//待执行操作runner.stop();// 停止 EventRunner在新创建的线程里投递事件到原线程 EventHandler 从新创建的线程投递事件到原线程并进行处理开发步骤如下 创建 EventHandler 的子类在子类中重写实现方法 processEvent() 来处理事件。 private class MyEventHandler extends EventHandler {private MyEventHandler(EventRunner runner) {super(runner);}// 重写实现processEvent方法Overridepublic 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) {Overridepublic 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//线程ArunnerA EventRunner.create(false);runnerA.run(); // run之后一直循环卡在这里所以需要新建一个线程run//线程B//1.创建类继承EventHandlerpublic 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);}Overridepublic 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 processbreak;}case CODE_DOWNLOAD_FILE1: {... // your processbreak;}case CODE_DOWNLOAD_FILE1: {... // your processbreak;}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 AEventRunner runnerA EventRunner.create(downloadRunner); // 内部会新建一个线程//2.创建类继承 EventHandlerpublic 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);}Overridepublic 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 processbreak;}case CODE_DOWNLOAD_FILE1: {... // your processbreak;}case CODE_DOWNLOAD_FILE1: {... // your processbreak;}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;
http://www.dnsts.com.cn/news/63232.html

相关文章:

  • 邢台哪里可以做网站腾讯游戏推广代理加盟
  • 网站图片一般的像素怎样做校园网站推广
  • 受欢迎的锦州网站建设欧美设计网站
  • 网站开发系统流程图东莞住房和建设局网站
  • 24小时自动发货网站建设免费申请移动手机卡
  • 区域名 网站建设公司的销售好做吗html搜索框代码
  • 怎样登入网站后台电子商务网站建设实训方案
  • wordpress 主题添加标签重庆官网seo分析
  • 上海建设网站养一个空壳公司的好处
  • 怎么识别网站是用什么语言做的推广普通话ppt
  • 新开传奇网站刚开企业网站代维护
  • 做网站的版权问题城市建设的网站 政策法规
  • 互联网创意网站有哪些做网站的工资
  • 网站建设大致分哪几个板块深圳建站公司开发费用
  • 济南网站优化技术厂家电商网站设计欣赏
  • 微商网站怎么做旅游网站制作分析
  • 唯品会 只做特卖的网站什么是网络营销例子
  • html怎么做网站背景上饶公司做网站
  • 无锡点个赞建站郑州百度网站快速优化
  • 高职两学一做专题网站外包加工网怎么样
  • 网站 动态 标签页市场营销考研可以考哪些专业
  • 国际交流合作网站建设方案十堰h5响应式网站
  • 京东pc网站用什么做的而的跟地seo排名点击软件
  • 网站开发到上线 多久最新网域查询入口
  • 网站开发的规格描述推广效果好的有哪些
  • 网站建设技术的实现python写网页
  • 新沂网站建设无锡崇安网站建设
  • 做网站相关人员贵州有哪些公司做网站做得好
  • 电商网站服务排名seo是啥职位
  • 百度做网站的特点行业网站建设蓝云