談及接觸到 HarmonyOS 應用的開發,主要是因為在 2020 年年底接到華為一個項目為某兩所 985 高校開發實驗案例手冊,一個是上層應用方向的,一個是操作系統層的。
說實話,當時只是知道 HarmonyOS,而沒有了解過其中任何開發技術。
但是這兩個層面自己也算很有底氣去接,首先是對新知識新技術的饑渴(特別還是國產化的),加上自己畢竟做過 10 年的應用開發和 3 年的操作系統以及底層協議棧開發。
下面談談我是如何學習一門新技術的吧。首先作為一個開發老鳥肯定是項目驅動學習,這個已經很多年都是這樣了,從最初的 VC 到 Delphi 到 PHP、Java 到 Android、Python 等等。
01
項目案例需求分析與項目移植
我這里就拿之前我之前編寫的實驗指導手冊之一《HarmonyOS 手機通訊錄開發 實驗指導手冊》這個說起吧。
編寫這個案例之前,首先是對這個案例需求基本不用我多想,很小一個案例,頭腦中已經有一個原型出來了。
當然沒有必要自己畫原型圖,這里貼一個最終實現的效果圖。
然后根據以往的項目經驗來構想,如果使用 Android 或者 Vue 實現該是怎樣幾個步驟,其實 Android 和 Vue 的語法雖然不一樣,但基本思路也是類似的,不同技術棧的切換對比式學習非常重要。
這里還有點需要切記,別著急看 API 和動手寫代碼。
經過以上的構思,我很快就已經形成了一個初步的功能實現思路,并且能盡可能地多融匯一些開發常用的技術棧進來:
實現通訊錄主頁 UI 布局。疑問點:通訊錄的 UI 布局在 HarmonyOS 中如何實現,里面涉及的 UI 組件 Sdk 是否具備。
實現聯系人列表靜態數據渲染。
實現按鈕點擊、列表點擊、長按等各種監聽事件,使用日志打印模擬業務、debug 調試。
添加聯系人詳情頁面,實現頁面之間跳轉傳參。
通過彈出窗口來編寫添加聯系人頁面。
聯系人列表數據的動態刷新。
靜態數據切換為本地持久化數據,比如是否存在 sqlite,相應會對應數據的 CRUD 操作。
靜態數據切換為服務端數據,http 網絡通信如何使用?是否涉及權限控制。
自定義組件使用。
下面再來帶著這個思路和疑問去網上找資料。我個人習慣優先查閱官網資料。前期大家也別太依賴博客,畢竟博客里面的坑會一大堆,還跳不出來,講到這希望社區別打我啊。
起碼我編寫完成系列手冊時沒有翻閱博客,當然可能那個時候的相關博客也極其少吧,畢竟官網資料也很少并且還存在部分錯誤。
02
閱讀官方開發文檔
不得不說,現在華為官方文檔非常強大,我這里講下看官方文檔的技巧吧,沒必要全篇通讀細讀,帶著項目需求去閱讀。
首先我就是尋找目錄,看看是不是我上面的功能需求 HarmonyOS Sdk 是不是都支持。
閱讀之后發現 HarmonyOS 存在兩個 SDK,Java 的和 JS 的,簡單看了下入門案例就知道咋弄了,不用過于糾結其中細節了。
JS 的我就對比 Vue 和微信小程序的思路去進行即可,Java 的就先類比 Android 的去弄,等后面具體編寫代碼實現功能的時候再來排坑。
所以后面又對該項目編寫了一個 JS 版本的通訊錄開發,以及后面發現 HarmonyOS 重要的分布式開發技術,還編寫了 Java 和 JS 混合開發,js FA 調用 java PA 的數據的內容,這些都是在通讀文檔之后做了項目延申。
確認好了 sdk 基本都支持我要的需求之后,下面就開始實施代碼編輯了。
03
開發必備 HelloWorld
作為一個老鳥,我一直給學生強調 HelloWorld 的重要性。自行參照官網入門案例搭建開發環境,并且運行起來 HelloWorld 項目。
官網步驟很詳細,沒有啥多解釋的。我這里強調幾個關鍵點,對 HelloWorld 工程項目組織結構請好好看看。
個人認為前期最主要的就是要熟悉這個項目組織結構,特別是還分 JS 版和 Java 版的,如有不清楚的請閱讀官方文檔對這塊的講解。
至于調試,前期只有網絡版的模擬器,并且要華為賬號認證,每個小時會自動釋放,這個清楚習慣即可,沒必要糾結。
至于 DevEco Studio 這個 IDE 我沒什么多說的,熟練使用過 IDEA 或者 Android Studio 等 JetBrains 全家桶產品的開發者來說,就順手拈來了。至于剛接觸的還是先花心簡單熟悉下常用操作吧。
04
代碼編寫、閱讀官方文檔、填坑
由于前面已經分解了開發步驟,所以編寫代碼目的性非常明確,思路清晰,如果是初學者缺乏項目經驗,從一個個小語法知識點開始學起,比如一個小小按鈕學半天,那樣開發和學習就太慢了。
所以我還是建議多用項目式貫穿學習,特別是自己曾經做過的項目移植或者需求非常清楚的項目代入。
既然知道了 Java SDK 開發,然后發現可以和 Android 進行對比開發,那么真多 Android 老鳥來說要做的就是編寫代碼邊做好差異化記錄筆記即可。
之前我同事也在社區上發布了一篇《安卓VS鴻蒙第三方件切換寶典》。
首先強調一個編寫代碼習慣。首先是包結構的合理劃分,包名清晰,然后就是類名、方法名、變量名、常量名命名規范,這樣即使注釋很少沒有詳細設計文檔也很方便閱讀代碼。
然后是 git 的使用,每完成一個核心步驟及時提交并且編寫簡要明了的提交日志。
然后就是一步步去解決問題了:
①實現通訊錄主頁 UI 布局
針對本項目案例先把上下結構菜單欄和空列表布局出來,然后微微調整美觀細節,此時你就會對布局內容掌握的七七八八了,沒有必要進一步深究了。
此時可以記錄下 Android 和 HarmonyOS 的布局知識點異同點。
②實現聯系人列表靜態數據渲染
發現和 Android 列表數據渲染實現類似,也是采用一個 lsit ui 組件配合 provider 進行實現。
③實現按鈕點擊、列表點擊、長按等各種監聽事件,使用日志打印模擬業務、debug 調試
點擊事件監聽是應用中最常用來觸發業務邏輯的,前期在沒有實際業務的時候,請用日志打印來取代實際業務即可,初學者往往會吐槽 sysout、log 好無聊,后面你就會發現它最好用。
這里我重點強調一個問題,做開發一定要 hold 住關鍵點,現在是要學習掌握點擊事件的觸發,不用真要出一個實際業務場景。
比如做大數據分析,重點是采用哪些大數據技術去根據原數據集分析出我所關注的哪些維度的數據。這些才是核心,而不是這些數據如何漂亮的展示出來。
當你覺得 console 下打印這些數據最漂亮的時候,我會覺得你進步了。
當然回過頭來,后面還是要做些這些事件里面加入實際業務的操作,比如長按刪除聯系人的操作。
這樣你就完全知道實際業務和最初所學基礎知識點是如何串聯起來的了,達到此目的即可。
④添加聯系人詳情頁面,實現頁面之間跳轉傳參
數據的交互可以說是應用開發時候的核心,比如傳統的 Web 開發、前后端分離模式的 Web 開發、App 類 CS 程序開發,都逃不過數據的交互。
實現此功能我們首先要拋開某門特定的編程技術,而是想著以下幾個關鍵點:
如何創建多個頁面
如何設置某個頁面為首頁
在哪里觸發頁面跳轉
前一個頁面的數據如何傳遞到下一個頁面
數據傳遞支持哪些數據結構
數據如何從下一個頁面回傳回來
然后我們再來去閱讀官方文檔找尋相應 API 進行處理即可。
這里著重提示,我個人開發理念里面把 API 語法放到非常低的地位,重來不記憶 API。
比如你只需要知道 sdk 中肯定有個 API 能夠實現頁面跳轉的功能,然后自己能夠快速的查閱資料或者自己的筆記、編寫過的 demo,做到眼熟即可。
這樣保證常用的 API 在你很長一段時間沒有做此類開發之后依然能讓你在 1 分鐘之類解決問題。
特別是如果你學習過七八門編程語言之后,越發不可能去記各種 API 了。
⑤通過彈出窗口來編寫添加聯系人頁面
⑥聯系人列表數據的動態刷新
這兩步依然是查閱官方資料即可實現,做好對比和記錄即可。
⑦靜態數據切換為本地持久化數據,比如是否存在 sqlite,相應會對應數據的 CRUD 操作
這步涉及到數據庫的使用,查閱資料之后,發現依然是傳統的原生 sql 操作和 ORM 模型操作,至于 CRUD 我不多說了,初學者最開始主要都是干這個,開發老鳥見到這個都想吐了。
這里不多說,我認為原生 sql 雖然沒有 ORM 操作起來清爽,但是學習成本低,學會原生 sql 玩轉所有數據庫。因此我還是更推薦原生 sql 使用。
到這一步有一個我非常想重點強調的步驟就是,對方法(即函數)的編寫,大的業務層面面向接口設計,落實業務的時候面向對象設計,實施落地的時候最重要的就是方法的設計編寫。
一個優秀的代碼開發者,在想清楚需求之后,只需要編寫出方法的兩個關鍵要素,方法形參和返回值,那么他一定就能實現該業務。
這里就重點在于他對業務的深入理解和數據的交互,因此前期在編寫代碼的時候幾步偽代碼就可以完成一個功能模塊的設計與實現。
下面我編寫下偽代碼:
(1)---實現布局----
(2)在AbilitySlice中關聯布局,并且初始化要使用的各個UI組件,初始化監聽事件
(3)編寫三個核心業務方法,用于數據的幾種場景切換
//獲取sqlite數據庫中的數據,集成sqlite之后調用這個方法取代之前的靜態數據方法
private List《Contacts》 getSqliteData() {
}
//生成靜態的列表數據進行模擬,在對接sqlite或者服務端之后不再使用
private List《Contacts》 getData() {
}
//通過http請求獲取服務端數據
private void getServerData() {
}
(4)菜單選擇監聽事件切換數據源加載
switch (position) {
case 0:
getData();
break;
case 1:
getSqliteData()
break;
case 2:
getServerData();
break;
}
這里提到數據庫的操作,我們也可以引入習慣的 dao 接口設計考慮,編寫相應 dao 層,然后設計實現類進行實現。
同時上面的偽代碼方法還可以封裝到一個獲取數據服務的 Service 接口中,然后利用業務接口進行實現。此處依然是想強調設計先于代碼。
⑧靜態數據切換為服務端數據,http 網絡通信如何使用?是否涉及權限控制
http 網絡通信在 app 開發中必不可少的東西,既然是 java SDK,那顯然會想到支持最原生的 HttpConnection api。
查閱官網資料也會發現肯定是支持的,但是一般不會使用原生的,往往會引入一些第三方優秀庫進行開發。
比如 okhttp 就是存粹的 java jar 包,進入開發即可,由于不是 Android 開發,這里不要引入 Android 的 aar 庫進行開發。
網絡開發中就會再遇到各種不同的坑,比如權限申請、ui 主線程不能執行網絡耗時任務等,這些都可以通過經驗或者閱讀報錯日志一一解決。
提到網絡通信交互,不得不想到各種 MVC、MVP、MVVM 設計模式了,起初當然最熟悉的還是 MVC,先使用傳統的 MVC 去進行開發,后續可以自行封裝 MVP 的開發模式。
⑨自定義組件使用
HarmonyOS 處于起步階段,最初的 sdk 開發包只會帶有基礎功能的開發,如果全部基于原生 sdk 進行開發,項目開發效率肯定會比傳統的 Android、iOS 低太多。
因為他們已經非常成熟,有大量優秀的開源第三方組件庫,說白了現在開發一個應用就跟碼積木一樣。
現在就需要大量優秀開發者造出各種優秀的輪子出來讓大家可以更快速的開發項目。
編寫一個自定義組件確實比完成一個簡單的項目需求要更加有意思和成就感,即使一個非常小的組件,那么這個就需要耐心閱讀官方sdk api甚至底層代碼實現了。
當然現在官網文檔很齊全,我在編寫第一個組件的時候還是消耗了很多精力的,那個時候文檔缺乏,只能看比較生澀的 API 文檔,然后半猜半試搗鼓出來。
⑩重要特性功能引入
讀完官方文檔之后,發現了分布式數據通信、協同、流轉等重要技術,后面就主要思考使用場景將其整合開發進去。
本案例正好可以運用分布式 pa 和 fa 的互相調用,對于這個功能引用也可以完美的通過該項目案例進行整合,這種整合類的也能更考驗對新知識的融會貫通。
比如 js 開發一個通訊錄 fa,然后 java 開發通訊錄數據服務 pa,fa 去獲取 pa 中的數據即可。
05
無法解決的坑如何求助
這里著重給初學者一個忠告,不要遇到一個問題就馬上求助問人,一個問題出現首先要通過查看日志進行解決,自行翻閱資料,反復嘗試,錯誤復現手段記錄,對比場景解決等措施自行想辦法解決。
只有經過反復嘗試發現是問題的時候再來求助老師,并且求助之前能夠清晰的描述問題現象。
在項目開發中發現了官方文檔、工具等各種 Bug,做好了充分記錄和證據論證,然后提交給了華為方進行求助和整改,對于缺失的關鍵 API 操作或者技術描述也能明確提出合理化訴求進行求助。
06
開發完成之后的項目復盤
如下:
梳理總結開發思路,主要是分析前期的思路是否存在不準確的地方
梳理回顧開發過程中遇到的坑點,自己是如何一步步填坑的
整理相關文檔,進行歸檔留存
整理該項目中所運用到的技術棧
梳理該項目待持續改進的地方
07
本項目所用到的相關的一些技術點
如下:
HarmonyOS 移動應用開發工具(DevEco Studio)使用。
UI 組件使用,包括 Text,Button,TextFiled,Image,RadioButton,RadioContainer,ToastDialog,ListContainer。
UI 布局的使用,包括 DirectionalLayout,DependentLayout。
日志打印,HiLog 的使用。
各種事件監聽操作與業務邏輯實現。(重難點)
ListContainer 子布局結合 RecycleItemProvider 的使用。(重難點)
對話框以及自定義對話框的使用。(重難點)
頁面生命周期以及頁面之間跳轉與傳參。
自定義組件(同時涉及到 Canvas)以及如何調用。(重難點)
數據存儲操作,主要涉及 sqlite 數據庫存儲。(重難點)
通過HTTP網絡通信與服務端交互。(重難點)
多線程通信。(重難點)
代碼編程規范、設計模式。(重難點)
08
個人總結
學習沒有捷徑,只有依靠一腔熱血和持之以恒的努力。反復跳坑填坑,多了自然觸類旁通,即使剛新接觸一個技術,也能快速搞定一個項目的移植,比如這個小項目案例從剛接觸到一天開發完成都足夠了。
學習編程切記執著語法和 API,而要注重思維鍛煉,多練習多踩坑多對比多總結才是王道。
對于開發老鳥,我對快速掌握 HarmonyOS 開發的建議是將自己原有的項目移植,并且盡可能多融入一些技術點。
對于初學者,我建議是找到一個我這種項目貫穿式案例然后配合自己查閱官方資料進行結合學習,也會事半功倍。
應用做多了,會慢慢失去興趣了,都是各種數據交互和 UI 渲染,這時強烈推薦大家去關注下操作系統層的源碼啊,此時 c 的代碼或許會看起來更親切哦。
我這里推薦的不是開發板和上層傳數據這類應用開發,而是操作系統內核代碼,值得一看。
責任編輯:haq
-
華為
+關注
關注
216文章
34429瀏覽量
251641 -
鴻蒙系統
+關注
關注
183文章
2634瀏覽量
66320 -
HarmonyOS
+關注
關注
79文章
1974瀏覽量
30166
原文標題:鴻蒙開發,小白入坑指南!
文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論