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