日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS線程間通信開發(fā)指導(dǎo)

場(chǎng)景介紹

成都創(chuàng)新互聯(lián)專注于網(wǎng)站建設(shè),為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)開發(fā)服務(wù),多年建網(wǎng)站服務(wù)經(jīng)驗(yàn),各類網(wǎng)站都可以開發(fā),品牌網(wǎng)站設(shè)計(jì),公司官網(wǎng),公司展示網(wǎng)站,網(wǎng)站設(shè)計(jì),建網(wǎng)站費(fèi)用,建網(wǎng)站多少錢,價(jià)格優(yōu)惠,收費(fèi)合理。

EventHandler開發(fā)場(chǎng)景

EventHandler 的主要功能是將 InnerEvent 事件或者 Runnable 任務(wù)投遞到其他的線程進(jìn)行處理,其使用的場(chǎng)景包括:

  • 開發(fā)者需要將 InnerEvent 事件投遞到新的線程,按照優(yōu)先級(jí)和延時(shí)進(jìn)行處理。投遞時(shí),EventHandler 的優(yōu)先級(jí)可在 IMMEDIATE、HIGH、LOW、IDLE 中選擇,并設(shè)置合適的 delayTime。
  • 開發(fā)者需要將 Runnable 任務(wù)投遞到新的線程,并按照優(yōu)先級(jí)和延時(shí)進(jìn)行處理。投遞時(shí), EventHandler 的優(yōu)先級(jí)可在 IMMEDIATE、HIGH、LOW、IDLE 中選擇,并設(shè)置合適的 delayTime。
  • 開發(fā)者需要在新創(chuàng)建的線程里投遞事件到原線程進(jìn)行處理。

EventRunner工作模式

EventRunner 的工作模式可以分為托管模式和手動(dòng)模式。兩種模式是在調(diào)用 EventRunner 的 create() 方法時(shí),通過(guò)選擇不同的參數(shù)來(lái)實(shí)現(xiàn)的,詳見(jiàn) API 參考。默認(rèn)為托管模式。

  • 托管模式:不需要開發(fā)者調(diào)用 run() 和 stop() 方法去啟動(dòng)和停止 EventRunner。當(dāng) EventRunner 實(shí)例化時(shí),系統(tǒng)調(diào)用 run() 來(lái)啟動(dòng) EventRunner;當(dāng) EventRunner 不被引用時(shí),系統(tǒng)調(diào)用 stop() 來(lái)停止 EventRunner。
  • 手動(dòng)模式:需要開發(fā)者自行調(diào)用 EventRunner 的 run() 方法和 stop() 方法來(lái)確保線程的啟動(dòng)和停止。

接口說(shuō)明

EventHandler

  • EventHandler 的屬性 Priority (優(yōu)先級(jí))介紹:

EventRunner 將根據(jù)優(yōu)先級(jí)的高低從事件隊(duì)列中獲取事件或者 Runnable 任務(wù)進(jìn)行處理。

屬性 描述
Priority.IMMEDIATE 表示事件被立即投遞
Priority.HIGH 表示事件先于 LOW 優(yōu)先級(jí)投遞
Priority.LOW 表示事件優(yōu)于 IDLE 優(yōu)先級(jí)投遞,事件的默認(rèn)優(yōu)先級(jí)是 LOW
Priority.IDLE 表示在沒(méi)有其他事件的情況下,才投遞該事件
  • EventHandler 的主要接口介紹:
接口名 描述
EventHandler(EventRunner runner) 利用已有的 EventRunner 來(lái)創(chuàng)建 EventHandler
current() 在processEvent 回調(diào)中,獲取當(dāng)前的 EventHandler
processEvent(InnerEvent event) 回調(diào)處理事件,由開發(fā)者實(shí)現(xiàn)
sendEvent(InnerEvent event) 發(fā)送一個(gè)事件到事件隊(duì)列,延時(shí)為 0 ms, 優(yōu)先級(jí)為 LOW
sendEvent(InnerEvent event, long delayTime) 發(fā)送一個(gè)延時(shí)事件到事件隊(duì)列,優(yōu)先級(jí)為 LOW
sendEvent(InnerEvent event, long delayTime, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的延時(shí)事件到事件隊(duì)列
sendEvent(InnerEvent event, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的事件到事件隊(duì)列,延時(shí)為 0 ms
sendSyncEvent(InnerEvent event) 發(fā)送一個(gè)同步事件到事件隊(duì)列,延時(shí)為 0 ms,優(yōu)先級(jí)為 LOW
sendSyncEvent(InnerEvent event, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的同步事件到事件隊(duì)列,延時(shí)為 0 ms,優(yōu)先級(jí)不可以是 IDLE
postSyncTask(Runnable task) 發(fā)送一個(gè) Runnable 同步任務(wù)到事件隊(duì)列,延時(shí)為 0 ms, 優(yōu)先級(jí)為 LOW
postSyncTask(Runnable task, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的 Runnable 同步任務(wù)到事件隊(duì)列,延時(shí)為 0 ms
postTask(Runnable task) 發(fā)送一個(gè) Runnable 任務(wù)到事件隊(duì)列,延時(shí)為 0 ms,優(yōu)先級(jí)為 LOW
postTask(Runnable task, long delayTime) 發(fā)送一個(gè) Runnable 延時(shí)任務(wù)到事件隊(duì)列,優(yōu)先級(jí)為 LOW
postTask(Runnable task, long delayTime, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的 Runnable 延時(shí)任務(wù)到事件隊(duì)列
postTask(Runnable task, EventHandler.Priority priority) 發(fā)送一個(gè)指定優(yōu)先級(jí)的 Runnable 任務(wù)到事件隊(duì)列,延時(shí)為 0 ms
sendTimingEvent(InnerEvent event, long taskTime) 發(fā)送一個(gè)定時(shí)事件到隊(duì)列,在 taskTime 時(shí)間執(zhí)行,如果 taskTime 小于當(dāng)前時(shí)間,立即執(zhí)行,優(yōu)先級(jí)為 LOW
sendTimingEvent(InnerEvent event, long taskTime, EventHandler.Priority priority) 發(fā)送一個(gè)帶優(yōu)先級(jí)的事件到隊(duì)列,在 taskTime 時(shí)間執(zhí)行,如果 taskTime 小于當(dāng)前時(shí)間,立即執(zhí)行
postTimingTask(Runnable task, long taskTime) 發(fā)送一個(gè) Runnable 任務(wù)到隊(duì)列,在 taskTime 時(shí)間執(zhí)行,如果 taskTime 小于當(dāng)前時(shí)間,立即執(zhí)行,優(yōu)先級(jí)為 LOW
postTimingTask(Runnable task, long taskTime, EventHandler.Priority priority) 發(fā)送一個(gè)帶優(yōu)先級(jí)的 Runnable 任務(wù)到隊(duì)列,在 taskTime 時(shí)間執(zhí)行,如果 taskTime 小于當(dāng)前時(shí)間,立即執(zhí)行
removeEvent(int eventId) 刪除指定 id 的事件
removeEvent(int eventId, long param) 刪除指定 id 和 param 的事件
removeEvent(int eventId, long param, Object object) 刪除指定 id、param 和 object 的事件
removeAllEvent() 刪除該EventHandler的所有事件
getEventName(InnerEvent event) 獲取事件的名字
getEventRunner() 獲取該 EventHandler 綁定的 EventRunner
isIdle() 判斷隊(duì)列是否為空
hasInnerEvent(Runnable runnable) 是否有還未被處理的這個(gè)任務(wù)

EventRunner

  • EventRunner的主要接口介紹:
接口名 描述
create() 創(chuàng)建一個(gè)擁有新線程的 EventRunner
create(boolean inNewThread) 創(chuàng)建一個(gè)擁有新線程的 EventRunner,isDeposited 為 true 時(shí),EventRunner 為托管模式,系統(tǒng)將自動(dòng)管理該 EventRunner;isDeposited 為 false 時(shí),EventRunner 為手動(dòng)模式。
create(String newThreadName) 創(chuàng)建一個(gè)擁有新線程的 EventRunner, 新線程的名字是 newThreadName
current() 獲取當(dāng)前線程的 EventRunner
run() EventRunner 為手動(dòng)模式時(shí),調(diào)用該方法啟動(dòng)新的線程
stop() EventRunner 為手動(dòng)模式時(shí),調(diào)用該方法停止新的線程

InnerEvent

  • InnerEvent的屬性介紹:
屬性 描述
eventId 事件的 ID, 由開發(fā)者定義用來(lái)辨別事件
object 事件攜帶的 Object 信息
param 事件攜帶的 long 型數(shù)據(jù)
  • InnerEvent的主要接口介紹:
接口名 描述
drop() 釋放一個(gè)事件實(shí)例
get() 獲得一個(gè)事件實(shí)例
get(int eventId) 獲得一個(gè)指定的 eventId 的事件實(shí)例
get(int eventId, long param) 獲得一個(gè)指定的 eventId 和 param 的事件實(shí)例
get(int eventId, long param, Object object) 獲得一個(gè)指定的 eventId, param 和 object 的事件實(shí)例
get(int eventId, Object object) 獲得一個(gè)指定的 eventId 和 object 的事件實(shí)例
PacMap getPacMap() 獲取 PacMap,如果沒(méi)有,會(huì)新建一個(gè)
Runnable getTask() 獲取 Runnable 任務(wù)
PacMap peekPacMap() 獲取 PacMap
void setPacMap(PacMap pacMap) 設(shè)置 PacMap

開發(fā)步驟

EventHandler 投遞 InnerEvent 事件

EventHandler 投遞 InnerEvent 事件,并按照優(yōu)先級(jí)和延時(shí)進(jìn)行處理,開發(fā)步驟如下:

  1. 創(chuàng)建 EventHandler 的子類,在子類中重寫實(shí)現(xiàn)方法 processEvent() 來(lái)處理事件。
   private class MyEventHandler extends EventHandler {
       private MyEventHandler(EventRunner runner) {
       super(runner);
       }
       // 重寫實(shí)現(xiàn)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:
                   // 待執(zhí)行的操作,由開發(fā)者定義
               break;
           default:
           break;
       }
       }
   }

  1. 創(chuàng)建 EventRunner,以手動(dòng)模式為例。
   EventRunner runner = EventRunner.create(false);// create()的參數(shù)是 true時(shí),則為托管模式
   // 需要對(duì) EventRunner 的實(shí)例進(jìn)行校驗(yàn),因?yàn)閯?chuàng)建 EventRunner 可能失敗,如創(chuàng)建線程失敗時(shí),創(chuàng)建 EventRunner 失敗。
   if (runner == null) {
       return;
   }

  1. 創(chuàng)建 EventHandler 子類的實(shí)例。
   MyEventHandler myHandler = new MyEventHandler(runner);

  1. 獲取 InnerEvent 事件。
   // 獲取事件實(shí)例,其屬性 eventId, param, object 由開發(fā)者確定,代碼中只是示例。
   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);

  1. 投遞事件,投遞的優(yōu)先級(jí)以 IMMEDIATE 為例,延時(shí)選擇 0ms和 2ms。
   // 優(yōu)先級(jí) immediate,投遞之后立即處理,延時(shí)為 0ms,該語(yǔ)句等價(jià)于同步投遞sendSyncEvent(event1,EventHandler.Priority.immediate);
   myHandler.sendEvent(event1, 0, EventHandler.Priority.IMMEDIATE);
   myHandler.sendEvent(event2, 2, EventHandler.Priority.IMMEDIATE); // 延時(shí) 2ms 后立即處理

  1. 啟動(dòng)和停止 EventRunner,如果為托管模式,則不需要此步驟。
   runner.run();
   //待執(zhí)行操作
   runner.stop();// 開發(fā)者根據(jù)業(yè)務(wù)需要在適當(dāng)時(shí)機(jī)停止 EventRunner

EventHandler 投遞 Runnable 任務(wù)

EventHandler 投遞Runnable 任務(wù),并按照優(yōu)先級(jí)和延時(shí)進(jìn)行處理,開發(fā)步驟如下:

  1. 創(chuàng)建 EventHandler 的子類,創(chuàng)建 EventRunner,并創(chuàng)建 EventHandler 子類的實(shí)例,步驟與[ EventHandler 投遞 InnerEvent] 場(chǎng)景的步驟1-3相同。
  1. 創(chuàng)建 Runnable 任務(wù)。
   Runnable task1 = new Runnable() {
       @Override
       public void run() {
           // 待執(zhí)行的操作,由開發(fā)者定義
       }
   };
   Runnable task2 = new Runnable() {
       @Override
       public void run() {
           // 待執(zhí)行的操作,由開發(fā)者定義
       }
   };

  1. 投遞 Runnable 任務(wù),投遞的優(yōu)先級(jí)以 IMMEDIATE 為例,延時(shí)選擇 0ms 和 2ms。
   //優(yōu)先級(jí)為 immediate,延時(shí) 0ms,該語(yǔ)句等價(jià)于同步投遞myHandler.postSyncTask(task1,EventHandler.Priority.immediate);
   myHandler.postTask(task1,0, EventHandler.Priority.IMMEDIATE);

    
   myHandler.postTask(task2,2, EventHandler.Priority.IMMEDIATE);// 延時(shí)2ms后立即執(zhí)行

  1. 啟動(dòng)和停止 EventRunner,如果是托管模式,則不需要此步驟。
   runner.run();
   //待執(zhí)行操作

    
   runner.stop();// 停止 EventRunner

在新創(chuàng)建的線程里投遞事件到原線程

EventHandler 從新創(chuàng)建的線程投遞事件到原線程并進(jìn)行處理,開發(fā)步驟如下:

  1. 創(chuàng)建 EventHandler 的子類,在子類中重寫實(shí)現(xiàn)方法 processEvent() 來(lái)處理事件。
   private class MyEventHandler extends EventHandler {
       private MyEventHandler(EventRunner runner) {
       super(runner);
       }
       // 重寫實(shí)現(xiàn)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:
                   // 待執(zhí)行的操作,由開發(fā)者定義
               break;
               case CASE2:
                   // 將原先線程的EventRunner實(shí)例投遞給新創(chuàng)建的線程
                   if (object instanceof EventRunner) {
                   EventRunner runner2 = (EventRunner)object;
                   }
                   // 將原先線程的EventRunner實(shí)例與新創(chuàng)建的線程的EventHandler綁定
                   EventHandler myHandler2 = new EventHandler(runner2) {
                   @Override
                   public void processEvent(InnerEvent event) {
                  //需要在原先線程執(zhí)行的操作
                   }
                   };
                   int eventId = 1; 
                   long param = 0; 
                   Object object = null; 
                   InnerEvent event2 = InnerEvent.get(eventId, param, object);
                   myHandler2.sendEvent(event2); // 投遞事件到原先的線程
                   break;
           default:
           break;
       }
       }
   }

  1. 創(chuàng)建 EventRunner,以手動(dòng)模式為例。
   EventRunner runner1 = EventRunner.create(false);// create()的參數(shù)是true時(shí),則為托管模式。
   // 需要對(duì) EventRunner 的實(shí)例進(jìn)行校驗(yàn),不是任何線程都可以通過(guò) create 創(chuàng)建,例如:當(dāng)線程池已滿時(shí),不能再創(chuàng)建線程。
   if (runner1 == null) {
       return;
   }

  1. 創(chuàng)建 EventHandler 子類的實(shí)例。
   MyEventHandler myHandler1 = new MyEventHandler(runner1);

  1. 獲取 InnerEvent 事件。
   // 獲取事件實(shí)例,其屬性 eventId, param, object 由開發(fā)者確定,代碼中只是示例。
   int eventId1 = 0;
   long param = 0; 
   Object object = (Object) EventRunner.current();
   InnerEvent event1 = InnerEvent.get(eventId1, param, object);

  1. 投遞事件,在新線程上直接處理。
   // 將與當(dāng)前線程綁定的 EventRunner 投遞到與 runner1 創(chuàng)建的新線程中  myHandler.sendEvent(event1);

  1. 啟動(dòng)和停止 EventRunner,如果是托管模式,則不需要此步驟。
   runner.run();
   //待執(zhí)行操作

    
   runner.stop();// 停止 EventRunner

完整代碼示例

  • 非托管情況:
  //全局:
  EventRunner runnerA

   
  //線程A:
  runnerA = EventRunner.create(false);
  runnerA.run(); // run之后一直循環(huán)卡在這里,所以需要新建一個(gè)線程run

   
  //線程B:
  //1.創(chuàng)建類繼承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.創(chuàng)建 MyEventHandler 實(shí)例
  MyEventHandler handler = new MyEventHandler(runnerA);

   
  // 3.向線程 A 發(fā)送事件
  handler.sendEvent(CODE_DOWNLOAD_FILE1);
  handler.sendEvent(CODE_DOWNLOAD_FILE2);
  handler.sendEvent(CODE_DOWNLOAD_FILE3);
  ......

   
  // 4.runnerA 不再使用后,退出
  runnerA.stop();

  • 托管情況:
  //1.創(chuàng)建 EventRunner A:
  EventRunner runnerA = EventRunner.create("downloadRunner"); // 內(nèi)部會(huì)新建一個(gè)線程

   
  //2.創(chuàng)建類繼承 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.創(chuàng)建MyEventHandler實(shí)例
  MyEventHandler handler = new MyEventHandler(runnerA);

   
  //4.向線程A發(fā)送事件
  handler.sendEvent(CODE_DOWNLOAD_FILE1);
  handler.sendEvent(CODE_DOWNLOAD_FILE2);
  handler.sendEvent(CODE_DOWNLOAD_FILE3);
  ......

   
  //5.runnerA沒(méi)有任何對(duì)象引入時(shí),線程會(huì)自動(dòng)回收
  runnerA = null;

當(dāng)前文章:創(chuàng)新互聯(lián)鴻蒙OS教程:鴻蒙OS線程間通信開發(fā)指導(dǎo)
本文鏈接:http://www.5511xx.com/article/dpccpoj.html