天天看點

「前端」鴻蒙開發,小白入坑指南!

談及接觸到 HarmonyOS 應用的開發,主要是因為在 2020 年年底接到華為一個項目為某兩所 985 高校開發實驗案例手冊,一個是上層應用方向的,一個是作業系統層的。歡迎閱讀~
「前端」鴻蒙開發,小白入坑指南!

說實話,當時隻是知道 HarmonyOS,而沒有了解過其中任何開發技術。

但是這兩個層面自己也算很有底氣去接,首先是對新知識新技術的饑渴(特别還是國産化的),加上自己畢竟做過 10 年的應用開發和 3 年的作業系統以及底層協定棧開發。

下面談談我是如何學習一門新技術的吧。首先作為一個開發老鳥肯定是項目驅動學習,這個已經很多年都是這樣了,從最初的 VC 到 Delphi 到 PHP、Java 到 Android、Python 等等。

一、項目案例需求分析與項目移植

我這裡就拿之前我之前編寫的實驗指導手冊之一《HarmonyOS 手機通訊錄開發 實驗指導手冊》這個說起吧。

編寫這個案例之前,首先是對這個案例需求基本不用我多想,很小一個案例,頭腦中已經有一個原型出來了。

當然沒有必要自己畫原型圖,這裡貼一個最終實作的效果圖:

「前端」鴻蒙開發,小白入坑指南!

然後根據以往的項目經驗來構想,如果使用 Android 或者 Vue 實作該是怎樣幾個步驟,其實 Android 和 Vue 的文法雖然不一樣,但基本思路也是類似的,不同技術棧的切換對比式學習非常重要。

這裡還有點需要切記,别着急看 API 和動手寫代碼。

經過以上的構思,我很快就已經形成了一個初步的功能實作思路,并且能盡可能地多融彙一些開發常用的技術棧進來:

  • 實作通訊錄首頁 UI 布局。疑問點:通訊錄的 UI 布局在 HarmonyOS 中如何實作,裡面涉及的 UI 元件 Sdk 是否具備。
  • 實作聯系人清單靜态資料渲染。
  • 實作按鈕點選、清單點選、長按等各種監聽事件,使用日志列印模拟業務、debug 調試。
  • 添加聯系人詳情頁面,實作頁面之間跳轉傳參。
  • 通過彈出視窗來編寫添加聯系人頁面。
  • 聯系人清單資料的動态重新整理。
  • 靜态資料切換為本地持久化資料,比如是否存在 sqlite,相應會對應資料的 CRUD 操作。
  • 靜态資料切換為服務端資料,http 網絡通信如何使用?是否涉及權限控制。
  • 自定義元件使用。

下面再來帶着這個思路和疑問去網上找資料。我個人習慣優先查閱官網資料。前期大家也别太依賴部落格,畢竟部落格裡面的坑會一大堆,還跳不出來,講到這希望社差別打我啊。

起碼我編寫完成系列手冊時沒有翻閱部落格,當然可能那個時候的相關部落格也極其少吧,畢竟官網資料也很少并且還存在部分錯誤。

二、閱讀官方開發文檔

不得不說,現在華為官方文檔非常強大,我這裡講下看官方文檔的技巧吧,沒必要全篇通讀細讀,帶着項目需求去閱讀。

首先我就是尋找目錄,看看是不是我上面的功能需求 HarmonyOS Sdk 是不是都支援。

閱讀之後發現 HarmonyOS 存在兩個 SDK,Java 的和 JS 的,簡單看了下入門案例就知道咋弄了,不用過于糾結其中細節了。

JS 的我就對比 Vue 和微信小程式的思路去進行即可,Java 的就先類比 Android 的去弄,等後面具體編寫代碼實作功能的時候再來排坑。

是以後面又對該項目編寫了一個 JS 版本的通訊錄開發,以及後面發現 HarmonyOS 重要的分布式開發技術,還編寫了 Java 和 JS 混合開發,js FA 調用 java PA 的資料的内容,這些都是在通讀文檔之後做了項目延申。

确認好了 sdk 基本都支援我要的需求之後,下面就開始實施代碼編輯了。

三、開發必備 HelloWorld

作為一個老鳥,我一直給學生強調 HelloWorld 的重要性。自行參照官網入門案例搭建開發環境,并且運作起來 HelloWorld 項目。

官網步驟很詳細,沒有啥多解釋的。我這裡強調幾個關鍵點,對 HelloWorld 工程項目組織結構請好好看看。

個人認為前期最主要的就是要熟悉這個項目組織結構,特别是還分 JS 版和 Java 版的,如有不清楚的請閱讀官方文檔對這塊的講解。

至于調試,前期隻有網絡版的模拟器,并且要華為賬号認證,每個小時會自動釋放,這個清楚習慣即可,沒必要糾結。

至于 DevEco Studio 這個 IDE 我沒什麼多說的,熟練使用過 IDEA 或者 Android Studio 等 JetBrains 全家桶産品的開發者來說,就順手拈來了。至于剛接觸的還是先花心簡單熟悉下常用操作吧。

四、代碼編寫、閱讀官方文檔、填坑

由于前面已經分解了開發步驟,是以編寫代碼目的性非常明确,思路清晰,如果是初學者缺乏項目經驗,從一個個小文法知識點開始學起,比如一個小小按鈕學半天,那樣開發和學習就太慢了。

是以我還是建議多用項目式貫穿學習,特别是自己曾經做過的項目移植或者需求非常清楚的項目代入。

既然知道了 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 中的資料即可。

五、無法解決的坑如何求助

這裡着重給初學者一個忠告,不要遇到一個問題就馬上求助問人,一個問題出現首先要通過檢視日志進行解決,自行翻閱資料,反複嘗試,錯誤複現手段記錄,對比場景解決等措施自行想辦法解決。

隻有經過反複嘗試發現是問題的時候再來求助老師,并且求助之前能夠清晰的描述問題現象。

在項目開發中發現了官方文檔、工具等各種 Bug,做好了充分記錄和證據論證,然後送出給了華為方進行求助和整改,對于缺失的關鍵 API 操作或者技術描述也能明确提出合理化訴求進行求助。

六、開發完成之後的項目複盤

如下:

  • 梳理總結開發思路,主要是分析前期的思路是否存在不準确的地方
  • 梳理回顧開發過程中遇到的坑點,自己是如何一步步填坑的
  • 整理相關文檔,進行歸檔留存
  • 整理該項目中所運用到的技術棧
  • 梳理該項目待持續改進的地方

七、本項目所用到的相關的一些技術點

如下:

  • HarmonyOS 移動應用開發工具(DevEco Studio)使用。
  • UI 元件使用,包括 Text,Button,TextFiled,Image,RadioButton,RadioContainer,ToastDialog,ListContainer。
  • UI 布局的使用,包括 DirectionalLayout,DependentLayout。
  • 日志列印,HiLog 的使用。
  • 各種事件監聽操作與業務邏輯實作。(重難點)
  • ListContainer 子布局結合 RecycleItemProvider 的使用。(重難點)
  • 對話框以及自定義對話框的使用。(重難點)
  • 頁面生命周期以及頁面之間跳轉與傳參。
  • 自定義元件(同時涉及到 Canvas)以及如何調用。(重難點)
  • 資料存儲操作,主要涉及 sqlite 資料庫存儲。(重難點)
  • 通過HTTP網絡通信與服務端互動。(重難點)
  • 多線程通信。(重難點)
  • 代碼程式設計規範、設計模式。(重難點)

八、個人總結

學習沒有捷徑,隻有依靠一腔熱血和持之以恒的努力。反複跳坑填坑,多了自然觸類旁通,即使剛新接觸一個技術,也能快速搞定一個項目的移植,比如這個小項目案例從剛接觸到一天開發完成都足夠了。

學習程式設計切記執着文法和 API,而要注重思維鍛煉,多練習多踩坑多對比多總結才是王道。

對于開發老鳥,我對快速掌握 HarmonyOS 開發的建議是将自己原有的項目移植,并且盡可能多融入一些技術點。

對于初學者,我建議是找到一個我這種項目貫穿式案例然後配合自己查閱官方資料進行結合學習,也會事半功倍。

應用做多了,會慢慢失去興趣了,都是各種資料互動和 UI 渲染,這時強烈推薦大家去關注下作業系統層的源碼啊,此時 c 的代碼或許會看起來更親切哦。

我這裡推薦的不是開發闆和上層傳資料這類應用開發,而是作業系統核心代碼,值得一看。

文章來源:https://mp.weixin.qq.com/s?__biz=MzkzNzE0MTA4OQ==&mid=2247488661&idx=1&sn=08ece9b9e31c4185dd1b09adc86749bb&chksm=c292a29bf5e52b8dfdd0b9eab87b2d8e178eac52d96fe6217245a171d83740f72358927e0017&scene=178&cur_album_id=1906196484774035459#rd

繼續閱讀