鴻蒙OS 線程間通信概述

2020-09-18 11:41 更新

在開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者經(jīng)常需要在當(dāng)前線程中處理下載任務(wù)等較為耗時(shí)的操作,但是又不希望當(dāng)前的線程受到阻塞。此時(shí),就可以使用 EventHandler 機(jī)制。EventHandler 是 HarmonyOS 用于處理線程間通信的一種機(jī)制,可以通過(guò) [EventRunner] 創(chuàng)建新線程,將耗時(shí)的操作放到新線程上執(zhí)行。這樣既不阻塞原來(lái)的線程,任務(wù)又可以得到合理的處理。比如:主線程使用 EventHandler 創(chuàng)建子線程,子線程做耗時(shí)的下載圖片操作,下載完成后,子線程通過(guò) EventHandler 通知主線程,主線程再更新 UI。

基本概念

EventRunner 是一種事件循環(huán)器,循環(huán)處理從該 EventRunner 創(chuàng)建的新線程的事件隊(duì)列中獲取 InnerEvent 事件或者 Runnable 任務(wù)。InnerEvent 是 EventHandler 投遞的事件。

EventHandler 是一種用戶(hù)在當(dāng)前線程上投遞 InnerEvent 事件或者 Runnable 任務(wù)到異步線程上處理的機(jī)制。每一個(gè) EventHandler 和指定的 EventRunner 所創(chuàng)建的新線程綁定,并且該新線程內(nèi)部有一個(gè)事件隊(duì)列。EventHandler 可以投遞指定的 InnerEvent 事件或 Runnable 任務(wù)到這個(gè)事件隊(duì)列。EventRunner 從事件隊(duì)列里循環(huán)地取出事件,如果取出的事件是 InnerEvent 事件,將在 EventRunner 所在線程執(zhí)行 processEvent 回調(diào);如果取出的事件是 Runnable 任務(wù),將在 EventRunner 所在線程執(zhí)行 Runnable 的 run 回調(diào)。一般,EventHandler 有兩個(gè)主要作用:

  • 在不同線程間分發(fā)和處理 InnerEvent 事件或 Runnable 任務(wù)。
  • 延遲處理 InnerEvent 事件或 Runnable 任務(wù)。

運(yùn)作機(jī)制

EventHandler 的運(yùn)作機(jī)制如下圖所示:

圖1 EventHandler 的運(yùn)作機(jī)制 點(diǎn)擊放大

使用 EventHandler 實(shí)現(xiàn)線程間通信的主要流程:

  1. EventHandler 投遞具體的 InnerEvent 事件或者 Runnable 任務(wù)到 EventRunner 所創(chuàng)建的線程的事件隊(duì)列。
  2. EventRunner 循環(huán)從事件隊(duì)列中獲取 InnerEvent 事件或者 Runnable 任務(wù)。
  3. 處理事件或任務(wù):
    • 如果 EventRunner 取出的事件為 InnerEvent 事件,則觸發(fā) EventHandler 的回調(diào)方法并觸發(fā) EventHandler 的處理方法,在新線程上處理該事件。
    • 如果 EventRunner 取出的事件為 Runnable 任務(wù),則 EventRunner 直接在新線程上處理 Runnable 任務(wù)。

約束限制

  • 在進(jìn)行線程間通信的時(shí)候,EventHandler 只能和 EventRunner 所創(chuàng)建的線程進(jìn)行綁定,EventRunner 創(chuàng)建時(shí)需要判斷是否創(chuàng)建成功,只有確保獲取的 EventRunner 實(shí)例非空時(shí),才可以使用 EventHandler 綁定 EventRunner。
  • 一個(gè) EventHandler 只能同時(shí)與一個(gè) EventRunner 綁定,一個(gè) EventRunner 上可以創(chuàng)建多個(gè) EventHandler。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)