HarmonyOS《鴻蒙操作系統(tǒng)開發(fā)入門經(jīng)典》|線程管理|剪貼板
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
本文引言
時間:2021年7月24日08:28:18
本文包含筆者對徐文禮老師的《鴻蒙操作系統(tǒng)開發(fā)入門經(jīng)典》的學(xué)習(xí)過程中的筆記總結(jié)、拓展思考、案例反饋、閱讀體驗(yàn)。
為尊重老師的知識產(chǎn)權(quán)和精簡本文,本文不會粘貼代碼、倒置案例、機(jī)械打字。
3.7 線程管理
3.7.1線程管理
時間:2021年7月24日08:50:383
注:這一部分書上跟開發(fā)文檔基本上就是一樣的
(from開發(fā)文檔)
1.概述
- 不同應(yīng)用在各自獨(dú)立的進(jìn)程中運(yùn)行。當(dāng)應(yīng)用以任何形式啟動時,系統(tǒng)為其創(chuàng)建進(jìn)程,該進(jìn)程將持續(xù)運(yùn)行。當(dāng)進(jìn)程完成當(dāng)前任務(wù)處于等待狀態(tài),且系統(tǒng)資源不足時,系統(tǒng)自動回收。
- 在啟動應(yīng)用時,系統(tǒng)會為該應(yīng)用創(chuàng)建一個稱為“主線程”的執(zhí)行線程。該線程隨著應(yīng)用創(chuàng)建或消失,是應(yīng)用的核心線程。UI界面的顯示和更新等操作,都是在主線程上進(jìn)行。主線程又稱UI線程,默認(rèn)情況下,所有的操作都是在主線程上執(zhí)行。
- 如果需要執(zhí)行比較耗時的任務(wù)(如下載文件、查詢數(shù)據(jù)庫),可創(chuàng)建其他線程來處理。
2.場景介紹
- 如果應(yīng)用的業(yè)務(wù)邏輯比較復(fù)雜,可能需要創(chuàng)建多個線程來執(zhí)行多個任務(wù)。這種情況下,代碼復(fù)雜難以維護(hù),任務(wù)與線程的交互也會更加繁雜。要解決此問題,開發(fā)者可以使用==“TaskDispatcher”==來分發(fā)不同的任務(wù)。
3.接口說明
- TaskDispatcher是一個任務(wù)分發(fā)器,它是Ability分發(fā)任務(wù)的基本接口,隱藏任務(wù)所在線程的實(shí)現(xiàn)細(xì)節(jié)。
- 為保證應(yīng)用有更好的響應(yīng)性,我們需要設(shè)計任務(wù)的優(yōu)先級。在UI線程上運(yùn)行的任務(wù)默認(rèn)以高優(yōu)先級運(yùn)行。
- TaskDispatcher具有多種實(shí)現(xiàn),每種實(shí)現(xiàn)對應(yīng)不同的任務(wù)分發(fā)器。在分發(fā)任務(wù)時可以指定任務(wù)的優(yōu)先級,由同一個任務(wù)分發(fā)器分發(fā)出的任務(wù)具有相同的優(yōu)先級。系統(tǒng)提供的任務(wù)分發(fā)器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher 、SpecTaskDispatcher。
為了更好地體現(xiàn)四個任務(wù)分發(fā)器的對比關(guān)系,筆者制表如下:
注:UITaskDispatcher、MainTaskDispatcher都屬于專有任務(wù)分發(fā)器SpecTastDispatcher。建議使用UITaskDispatcher。
- //GlobalTaskDispatcher全局并發(fā)任務(wù)分發(fā)器
- TaskDispatcher globalTaskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);
- //ParallelTaskDispatcher并發(fā)任務(wù)分發(fā)器
- String dispatcherName = "parallelTaskDispatcher";
- TaskDispatcher parallelTaskDispatcher = createParallelTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
- //SerialTaskDispatcher串行任務(wù)分發(fā)器
- String dispatcherName = "serialTaskDispatcher";
- TaskDispatcher serialTaskDispatcher = createSerialTaskDispatcher(dispatcherName, TaskPriority.DEFAULT);
- //SpecTaskDispatcher專有任務(wù)分發(fā)器
- TaskDispatcher uiTaskDispatcher = getUITaskDispatcher();
- 開發(fā)步驟總結(jié)
為了更好地體現(xiàn)開發(fā)任務(wù)的的對比關(guān)系,筆者制表如下:
3.7.2 線程間的通信
時間:2021年7月24日10:32:10
注:書中對于這一塊也是和開發(fā)文檔一模一樣的。
學(xué)習(xí)總結(jié):
目的:合理運(yùn)用線程資源
元素:事件(InnerEvent)、任務(wù)(Runnable)、機(jī)制(EventHandler)、循環(huán)器(EventRunner)
場景:投遞事件(雙向)、投遞任務(wù)、
方法:
- 創(chuàng)建機(jī)制子類并重寫方法
- 創(chuàng)建循環(huán)器
- 創(chuàng)建機(jī)制子類實(shí)例
- 投遞事件(需要獲取事件實(shí)例)、投遞任務(wù)
- 啟動或停止機(jī)制
1.概述
- 在開發(fā)過程中,開發(fā)者經(jīng)常需要在當(dāng)前線程中處理下載任務(wù)等較為耗時的操作,但是又不希望當(dāng)前的線程受到阻塞。此時,就可以使用EventHandler機(jī)制。
- EventHandler是HarmonyOS用于處理線程間通信的一種機(jī)制,可以通過EventRunner創(chuàng)建新線程,將耗時的操作放到新線程上執(zhí)行。這樣既不阻塞原來的線程,任務(wù)又可以得到合理的處理。
2.基本概念
- EventRunner是一種事件循環(huán)器,循環(huán)處理從該EventRunner創(chuàng)建的新線程的事件隊(duì)列中獲取InnerEvent事件或者Runnable任務(wù)。InnerEvent是EventHandler投遞的事件。
- EventHandler是一種用戶在當(dāng)前線程上投遞InnerEvent事件或者Runnable任務(wù)到異步線程上處理的機(jī)制。每一個EventHandler和指定的EventRunner所創(chuàng)建的新線程綁定,并且該新線程內(nèi)部有一個事件隊(duì)列。EventHandler可以投遞指定的InnerEvent事件或Runnable任務(wù)到這個事件隊(duì)列。
- EventRunner從事件隊(duì)列里循環(huán)地取出事件,如果取出的事件是InnerEvent事件,將在EventRunner所在線程執(zhí)行processEvent回調(diào);如果取出的事件是Runnable任務(wù),將在EventRunner所在線程執(zhí)行Runnable的run回調(diào)。一般,EventHandler有兩個主要作用:
- 在不同線程間分發(fā)和處理InnerEvent事件或Runnable任務(wù)
- 延遲處理InnerEvent事件或Runnable任務(wù)。
3.運(yùn)作機(jī)制
使用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ù)。
4.約束限制
- 在進(jìn)行線程間通信的時候,EventHandler只能和EventRunner所創(chuàng)建的線程進(jìn)行綁定,EventRunner創(chuàng)建時需要判斷是否創(chuàng)建成功,只有確保獲取的EventRunner實(shí)例非空時,才可以使用EventHandler綁定EventRunner。
- 一個EventHandler只能同時與一個EventRunner綁定,一個EventRunner可以同時綁定多個EventHandler。
5.EventRunner工作模式
EventRunner的工作模式可以分為托管模式和手動模式。兩種模式是在調(diào)用EventRunner的create()方法時,通過選擇不同的參數(shù)來實(shí)現(xiàn)的,詳見API參考。默認(rèn)為托管模式。
- 托管模式:不需要開發(fā)者調(diào)用run()和stop()方法去啟動和停止EventRunner。當(dāng)EventRunner實(shí)例化時,系統(tǒng)調(diào)用run()來啟動EventRunner;當(dāng)EventRunner不被引用時,系統(tǒng)調(diào)用stop()來停止EventRunner。
- 手動模式:需要開發(fā)者自行調(diào)用EventRunner的run()方法和stop()方法來確保線程的啟動和停止。
6.EventRunner、EventHandler的接口很多。
7.三種開發(fā)應(yīng)用
- EventHandler投遞InnerEvent事件
- EventHandler投遞Runnable任務(wù)
- 在新創(chuàng)建的線程里將事件投遞到原線程
3.6.17 系統(tǒng)剪貼板服務(wù)
時間:2021年7月24日08:28:14
系統(tǒng)剪貼板服務(wù):在應(yīng)用A中復(fù)制的數(shù)據(jù),可以在應(yīng)用B中粘貼
- HarmonyOS提供了系統(tǒng)剪切板服務(wù)的操作接口
- HarmonyOS提供了剪貼板數(shù)據(jù)的定義
注意:
- 只有在前臺獲取焦點(diǎn)的應(yīng)用才有讀取系統(tǒng)剪切板的權(quán)限
- 寫入數(shù)據(jù)不會隨應(yīng)用程序結(jié)束而被銷毀
- 數(shù)據(jù)會被覆蓋
- 同一設(shè)備剪切板單次傳遞內(nèi)容不應(yīng)超過800KB
接口說明:
SystePastedboard提供了系統(tǒng)剪貼板操作的相關(guān)接口(復(fù)制、粘貼、配置回調(diào))
PageData是剪貼板服務(wù)操作的數(shù)據(jù)對象,一個PageData由若干內(nèi)容節(jié)點(diǎn)(PageData.Record)和一個屬性集合對象(PageData.DataProperty)組成。
- Record是存放剪貼板數(shù)據(jù)信息的最小單位,每個Record都有特定的MIME類型(文本、HTML、URL、Intent)
- 剪貼板數(shù)據(jù)的屬性存放在DataProperty(時間戳、標(biāo)簽)
開發(fā)步驟:
- 獲取服務(wù)
- A寫入數(shù)據(jù)
- B讀取數(shù)據(jù)
- C添加數(shù)據(jù)變化回調(diào)
小總結(jié)
- 線程管理中四種任務(wù)分發(fā)器、三種派發(fā)任務(wù)、三種基礎(chǔ)操作、兩種屏障需要多多熟悉,根據(jù)前幾日做HCIA模擬題的經(jīng)驗(yàn),這部分出題是必然的。
- 線程通信需要總體把握,目的、場景、元素、方法。
- 剪貼板的原理一起都沒有仔細(xì)學(xué)習(xí)過,感覺很簡單,今日學(xué)習(xí)發(fā)現(xiàn)確實(shí)很簡單,但有一些需要在開發(fā)的過程中注意的地方。
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)