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