成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS Sample 之 EventHandler 線程間通信

開發 前端 OpenHarmony
在開發過程中,開發者經常需要在當前線程中處理下載任務等較為耗時的操作,但是又不希望當前的線程受到阻塞。此時,就可以使用EventHandler機制。

[[424567]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

1.介紹

在開發過程中,開發者經常需要在當前線程中處理下載任務等較為耗時的操作,但是又不希望當前的線程受到阻塞。

此時,就可以使用EventHandler機制。EventHandler是HarmonyOS用于處理線程間通信的一種機制,

可以通過EventRunner創建新線程,將耗時的操作放到新線程上執行。

這樣既不阻塞原來的線程,任務又可以得到合理的處理。比如:

主線程使用EventHandler創建子線程,子線程做耗時的下載圖片操作,下載完成后,子線程通過EventHandler通知主線程,主線程再更新UI。

2.搭建環境

安裝DevEco Studio,詳情請參考DevEco Studio下載

設置DevEco Studio開發環境,DevEco Studio開發環境需要依賴于網絡環境,需要連接上網絡才能確保工具的正常使用,可以根據如下兩種情況來配置開發環境:

如果可以直接訪問Internet,只需進行下載HarmonyOS SDK操作

如果網絡不能直接訪問Internet,需要通過代理服務器才可以訪問,請參考配置開發環境

下載源碼后,使用DevEco Studio 打開項目。

3.理論支持

EventRunner是一種事件循環器,循環處理隊列中的 InnerEvent事件 或者 Runnable任務。

EventHandler是一種在 當前線程 上 投遞 InnerEvent事件 或者 Runnable任務 到 異步線程上處理的機制。

InnerEvent是EventHandler投遞的事件結構對象。

EventHandler和指定的EventRunner所創建的新線程綁定,并且該新線程內部有一個事件隊列。

EventRunner的工作模式可以分為托管模式和手動模式。

投遞時,EventHandler的優先級可在IMMEDIATE、HIGH、LOW、IDLE中選擇。

詳細請參考 線程間通信開發概述

使用EventHandler實現線程間通信的主要流程:

EventHandler投遞具體的InnerEvent事件或者Runnable任務到EventRunner所創建的線程的事件隊列。

EventRunner循環從事件隊列中獲取InnerEvent事件或者Runnable任務。

處理事件或任務:

如果EventRunner取出的事件為InnerEvent事件,

則觸發EventHandler的回調方法并觸發EventHandler的處理方法,在新線程上處理該事件。

如果EventRunner取出的事件為Runnable任務,則EventRunner直接 在新線程上處理Runnable任務。

4.實例講解

4.1.UI界面

HarmonyOS Sample 之 EventHandler 線程間通信-鴻蒙HarmonyOS技術社區

4.2.后臺代碼

4.2.1 初始化EventRunner、EventHandler 對象

  1. /** 
  2.  * 初始化對象 
  3.  */ 
  4. private void initHandler() { 
  5.     //創建事件運行器,默認是托管模式,create()的參數是false時,則為手動模式 
  6.     eventRunner = EventRunner.create("TestRunner"); 
  7.      
  8.     //初始化事件處理器,需要傳入一個事件運行器 
  9.     handler = new TestEventHandler(eventRunner); 
  10.  
  11.     //第二個EventHandler 
  12.     myHandler=new MyEventHandler(eventRunner); 

4.2.2 發送普通事件

  1. /** 
  2.  * 發送一個普通事件 
  3.  * @param component 
  4.  */ 
  5. private void sendInnerEvent(Component component) { 
  6.     stringBuffer = new StringBuffer(); 
  7.     long param = 0L; 
  8.  
  9.     //獲取一個事件結構對象 
  10.     //InnerEvent 對象包含一個額外的整數字段和一個額外的對象字段來攜帶特定數據。 
  11.     InnerEvent normalInnerEvent = InnerEvent.get(EVENT_MESSAGE_NORMAL, param, null); 
  12.     InnerEvent delayInnerEvent = InnerEvent.get(EVENT_MESSAGE_DELAY, param, null); 
  13.  
  14.     //發送事件,事件結構對象+事件等級 
  15.     //IMMEDIATE:即時;IDLE:閑置;HIGH:高;LOW:低 
  16.     handler.sendEvent(normalInnerEvent, EventHandler.Priority.IMMEDIATE); 
  17.     HiLog.debug(LABEL,"Send a NormalEvent done"); 
  18.  
  19.     //發送一個延遲事件,事件結構對象+延遲時間+事件等級 
  20.     handler.sendEvent(delayInnerEvent, DELAY_TIME, EventHandler.Priority.IMMEDIATE); 
  21.     HiLog.debug(LABEL,"Send a DelayEvent done"); 
  22.  

輸出結果

  1. 09-09 12:14:36.512 14769-14769/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Send a NormalEvent done 
  2. 09-09 12:14:36.512 14769-14769/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Send a DelayEvent done 
  3. 09-09 12:14:36.512 14769-15211/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Received a NormalEvent 1631160876512 
  4. 09-09 12:14:37.512 14769-15211/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Received a DelayEvent 1631160877512 

4.2.3 發布可運行任務

  1. /** 
  2.  * 發布可運行任務 
  3.  * @param component 
  4.  */ 
  5. private void postRunnableTask(Component component) { 
  6.     stringBuffer = new StringBuffer(); 
  7.  
  8.     //任務1 
  9.     //Runnable任務,將在EventRunner所在線程執行Runnable的run回調。 
  10.     Runnable task1 = () -> { 
  11.         stringBuffer.append("Post runnableTask1 done").append(System.lineSeparator()); 
  12.         getUITaskDispatcher().asyncDispatch(() -> resultText.setText(stringBuffer.toString())); 
  13.         HiLog.debug(LABEL,"Post runnableTask1 done asyncDispatch"); 
  14.     }; 
  15.     //任務2 
  16.     //Runnable任務,將在EventRunner所在線程執行Runnable的run回調。 
  17.     Runnable task2 = () -> { 
  18.         stringBuffer.append("Post runnableTask2 done").append(System.lineSeparator()); 
  19.         getUITaskDispatcher().asyncDispatch(() -> resultText.setText(stringBuffer.toString())); 
  20.         HiLog.debug(LABEL,"Post runnableTask2 done asyncDispatch"); 
  21.     }; 
  22.  
  23.     HiLog.debug(LABEL,"Main Task run1..."); 
  24.  
  25.     //發布任務 
  26.     myHandler.postTask(task1, EventHandler.Priority.IMMEDIATE); 
  27.     HiLog.debug(LABEL,"Main Task run2..."); 
  28.      
  29.     //發布延遲任務,所以在task1后執行 
  30.     myHandler.postTask(task2, DELAY_TIME, EventHandler.Priority.IMMEDIATE); 
  31.     HiLog.debug(LABEL,"Main Task run3..."); 
  32.  

輸出結果

  1. 09-09 10:21:43.672 19863-19863/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Main Task run1... 
  2. 09-09 10:21:43.672 19863-19863/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Main Task run2... 
  3. 09-09 10:21:43.672 19863-19863/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Main Task run3... 
  4. 09-09 10:21:43.673 19863-31145/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Post runnableTask1 done asyncDispatch 
  5. 09-09 10:21:44.675 19863-31145/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Post runnableTask2 done asyncDispatch 

 4.2.4 發送一個跨線程的事件

  1. /** 
  2.  * 發送跨線程的事件 
  3.  * @param component 
  4.  */ 
  5. private void sendToOriginalThread(Component component) { 
  6.     stringBuffer = new StringBuffer(); 
  7.     long param = 0; 
  8.  
  9.     //獲取一個標志為跨線程的事件結構對象 
  10.     InnerEvent innerEvent = InnerEvent.get(EVENT_MESSAGE_CROSS_THREAD, param, eventRunner); 
  11.  
  12.     //發送一個延遲事件 
  13.     handler.sendEvent(innerEvent, DELAY_TIME, EventHandler.Priority.IMMEDIATE); 
  14.     HiLog.debug(LABEL,"send a CrossThreadAndDelayEvent done"+System.currentTimeMillis()); 
  15.  

 輸出結果

  1. 09-09 12:15:28.625 14769-14769/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  send a CrossThreadAndDelayEvent done1631160928625 
  2. 09-09 12:15:29.626 14769-15211/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  Received a CrossThreadAndDelayEvent 1631160929626 
  3. 09-09 12:15:29.626 14769-15211/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  send a ReplyEvent 1631160929626 
  4. 09-09 12:15:29.626 14769-15211/ohos.samples.eventhandler D 00001/=>MainAbilitySlice:  receive a ReplyEvent 1631160929626 

4.2.5 繼承事件處理器類,重寫處理事件的方法

  1. /** 
  2.  * 繼承事件處理器類,重寫處理事件的方法 
  3.  */ 
  4. private class TestEventHandler extends EventHandler { 
  5.  
  6.     /** 
  7.      * 默認構造函數 
  8.      * @param runner 
  9.      */ 
  10.     private TestEventHandler(EventRunner runner) { 
  11.         super(runner); 
  12.     } 
  13.  
  14.     @Override 
  15.     public void processEvent(InnerEvent event) { 
  16.         switch (event.eventId) { 
  17.             case EVENT_MESSAGE_NORMAL: 
  18.                 HiLog.debug(LABEL,"Received a NormalEvent "+System.currentTimeMillis()); 
  19.                 stringBuffer.append("Received an innerEvent message").append(System.lineSeparator()); 
  20.                 getUITaskDispatcher().asyncDispatch(() -> resultText.setText(stringBuffer.toString())); 
  21.                 break; 
  22.             case EVENT_MESSAGE_DELAY: 
  23.                 HiLog.debug(LABEL,"Received a DelayEvent "+System.currentTimeMillis()); 
  24.                 stringBuffer.append("Received an innerEvent delay message").append(System.lineSeparator()); 
  25.                 getUITaskDispatcher().asyncDispatch(() -> resultText.setText(stringBuffer.toString())); 
  26.                 break; 
  27.             case EVENT_MESSAGE_CROSS_THREAD: 
  28.                 HiLog.debug(LABEL,"Received a CrossThreadAndDelayEvent "+System.currentTimeMillis()); 
  29.                 //接收事件對象 
  30.                 Object object = event.object; 
  31.                 //判斷對象類型 
  32.                 if (object instanceof EventRunner) { 
  33.                     //將原先線程的EventRunner實例投遞給新創建的線程 
  34.                     EventRunner runner = (EventRunner) object; 
  35.                     // 將原先線程的EventRunner實例與新創建的線程的EventHandler綁定 
  36.                     EventHandler eventHandler = new EventHandler(runner) { 
  37.                         @Override 
  38.                         public void processEvent(InnerEvent innerEvent) { 
  39.                             //需要在原先線程執行的操作 
  40.                             HiLog.debug(LABEL,"receive a ReplyEvent "+System.currentTimeMillis()); 
  41.                             stringBuffer.append("OriginalThread receive a message"); 
  42.                             getUITaskDispatcher().asyncDispatch(() -> resultText.setText(stringBuffer.toString())); 
  43.                         } 
  44.                     }; 
  45.                     int testEventId = 1; 
  46.                     long testParam = 0; 
  47.                     //獲取事件傳遞的參數 
  48.                     InnerEvent innerEvent = InnerEvent.get(testEventId, testParam, null); 
  49.                     ///投遞事件到原先的線程 
  50.                     eventHandler.sendEvent(innerEvent); 
  51.                     HiLog.debug(LABEL,"send a ReplyEvent "+System.currentTimeMillis()); 
  52.                 } 
  53.                 break; 
  54.             default
  55.                 break; 
  56.         } 
  57.     } 
  58.  

5.問題與思考

5.1 發布一個定時任務到隊列,沒有得到預期的效果。

  1. //TODO 沒有得到預期的效果 
  2. myHandler.postTimingTask(task1,System.currentTimeMillis()+1000L, EventHandler.Priority.IMMEDIATE); 

5.2 思考一下 示例中 哪個地方體現了 “一個EventRunner可以同時綁定多個EventHandler” 這句話?

6.完整代碼

附件直接下載

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2017-08-07 20:18:11

Android線程handler

2021-09-15 14:55:49

鴻蒙HarmonyOS應用

2023-06-08 08:21:08

多線程編程線程間通信

2019-09-16 08:45:53

并發編程通信

2021-08-17 10:20:14

鴻蒙HarmonyOS應用

2021-01-04 11:44:05

鴻蒙HarmonyOSAbilitySlic

2021-11-23 09:58:35

鴻蒙HarmonyOS應用

2015-09-11 09:15:32

RyuSDN

2021-09-24 09:25:01

鴻蒙HarmonyOS應用

2021-09-22 09:42:41

鴻蒙HarmonyOS應用

2021-11-02 10:10:49

鴻蒙HarmonyOS應用

2021-07-08 09:42:04

鴻蒙HarmonyOS應用

2021-07-29 14:03:35

鴻蒙HarmonyOS應用

2022-05-20 10:32:49

事件循環器事件隊列鴻蒙

2010-01-05 10:00:48

Linux進程間通信

2021-01-18 05:11:14

通信Nodejs進程

2022-06-06 15:33:20

線程Java釋放鎖

2021-12-10 15:06:56

鴻蒙HarmonyOS應用

2021-11-30 14:51:11

鴻蒙HarmonyOS應用

2021-12-02 10:11:44

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品一区二区三区中文在线 | 天天视频成人 | 免费xxxx大片国产在线 | 毛片网站在线观看视频 | 黄色大片免费网站 | 欧美日韩成人在线 | 欧美日韩视频在线第一区 | 日本网站免费在线观看 | 国产性色视频 | 久草青青草 | 九九99精品 | 久久久久国产一区二区三区 | 国产精品99久久久久久动医院 | 久久国产精品-久久精品 | 波多野结衣av中文字幕 | 日韩免费在线观看视频 | 日韩精品区 | 草比av| 久久久www | 国产精品a久久久久 | 日韩精品一区二区三区视频播放 | 91精品久久久久久久久久 | 久久国产精品网站 | 五月天天色 | 日本高清中文字幕 | 成年人免费网站 | 亚洲高清一区二区三区 | 日本免费一区二区三区 | 黄色一级大片在线免费看产 | 蜜桃视频在线观看免费视频网站www | 日韩视频专区 | 成人av免费播放 | 国际精品鲁一鲁一区二区小说 | 欧美日韩亚洲国产 | 噜久寡妇噜噜久久寡妇 | 国产情侣一区 | 国产精品3区 | 在线观看免费国产 | 国产一级黄色网 | 欧美日韩国产一区二区三区 | 国产日韩精品一区 |