Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

安卓架構組件介紹

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Android Architecture Components.
Android Architecture Components: Lifecycle and LiveModel

Chinese (Traditional) (中文(繁體)) translation by xingshi (you can also view the original English article)

Android在2005年被引入,在這12年裡,Android取得了驚人的成功,它成為安裝量最高的移動作業系統。 在這12年間,有14種不同版本的作業系統被推出,Android系統越來越成熟。 然而,Android平臺中一個非常重要的領域一直被忽視,那就是:一種標準的架構模型,這種架構模型能夠處理平臺的特性,並且簡單到足以被普通開發著理解和使用。

好吧,好飯不怕晚。 在上一次Google I / O大會中,Android團隊終於決定解決這個問題,並回應世界各地開發者的回饋意見,宣佈推出Android應用架構,並提供實現它的基礎:新架構組件。 更棒的是,他們不僅做到了這一點,而且還是以我們都知道和喜愛的系統開源方式。

Architecture Components

在本教程中,我們將探討Android團隊在Google I / O大會中提出的標準化架構,並研究新架構元件的主要元素,包括:LifecycleViewModelLifeDataRoom。我們不會太關注代碼,而是側重於這些主題背後的概念和邏輯。 我們會看一些簡單的代碼片段,這些代碼片段都是使用Kotlin語言編寫的,Kotlin是被Android官方支援的神奇語言。

1.Android缺少什麼?

如果您安卓開發新手,那麼您可能不知道我在說什麼。畢竟,應用程式架構是一個很泛化的話題。 但相信我,你會很快會意識到它的重要性!隨著APP的發展和APP越來越複雜,APP架構將變得越來越重要。它可以使你的工作變得更輕鬆,也能讓你的生活變成地獄。

APP架構

粗略地說,APP架構是需要在開發過程開始之前持續進行的計畫。該計畫確定了不同應用程式的元件被組織和綁定的對應映射關係。它提出了在開發過程中應遵循的指導原則,並強制作出一些犧牲(通常與更多的類和樣板相關),以便最終幫助您構建一個更加可測試,可擴展和可維護的精心編寫的應用程式。

軟體應用程式架構是定義滿足所有技術和操作要求的結構化解決方案的過程,它能優化常見的品質屬性,包括安全性和可管理性等。它涉及到一系列基於許多因素的決策,每一個決策都可能對應用程式的品質,性能,可維護性和整體成功產生重大影響。
- 微軟軟體架構與設計指南

良好的架構考慮了很多因素,特別是系統的特點和局限性。 現在有許多不同的架構解決方案,他們各有千秋。然而,所有願景之間的一些關鍵概念是共同的。

舊的錯誤

直到上次Google I / O大會之前,Android系統並沒有推薦任何指定的應用程式開發架構。這意味著你完全可以自由地採用任何模型:MVP,MVC,MVPP,甚至根本沒有架構模型。 除此之外,Android框架甚至沒有為系統自身(特別是元件的生命週期)的問題提供當地語系化解決方案.

Great news at the Google IO 2017

因此,如果您想在應用程式中使用MVP(Model View Presenter)模型,那麼你需要從頭開始你自己的解決方案,編寫大量樣板代碼,或者在沒有官方支援的情況下使用某個協力廠商庫。而且,沒有標準會導致了許多應用程式寫的很糟糕,代碼庫難以維護和測試。

正如我所說,多年來這種情況一直備受詬病。事實上,關於這個問題,我最近寫了一系列文章,即 How to Adopt Model View Presenter on Android 。 但最重要的是,經過12年的漫長歲月,Android團隊終於決定聽聽我們的抱怨並幫助我們解決這個問題了。

2.安卓架構

新的Android體系架構指南(Android Architecture Guide )定義了一些關鍵原則,一個優秀的Android應用程式應該符合這些原則,而且該指南為開發者創建優秀的APP提供了安全的路線。但是,該指南明確規定,所提出的路線不是強制性的,採用哪種類型的架構由開發者自己決定。

根據指南,優秀的Android APP應該提供一個牢固的關注點隔離(separation of concerns),並且在model層驅動UI。 任何不處理UI或與作業系統交互的代碼不應該在Activity 或Fragment中,因為保持Activity 和 Fragment盡可能乾淨,可以避免許多與生命週期相關的問題。 畢竟,系統可以隨時銷毀掉Activity 或 Fragment。此外,資料應該由與UI隔離和與生命週期隔離的model層來處理。

被推薦的新架構

Android推薦的架構很難在我們所熟知的標準模型中找到對應。 它看起來像一個MVC(Model View Controller)模型,但它與系統的架構密切相關以至於很難使用已知的約定標記每個元素。 然而,這不重要的,因為重要的是它依賴於新的架構元件來創建關注點分離,而這具有出色的可測試性和可維護性。更棒的是,它很容易實現。

要瞭解Android團隊提出的建議,我們必須瞭解架構元件的所有元素,因為它們將為我們提供一些重要的功能。 一共有四個元件,每個元件具有特定的角色,包括:RoomViewModelLiveDataLifecycle。它們每個元件都有自己的責任,他們共同努力創造一個堅實的架構。 我們來看一下這個架構的簡化圖,以便更好地理解它。

Android Architecture

正如你所看到的,我們有三個主要元素,每一個都有它自己的責任。

  1. Activity 和 Fragment代表View層,它不涉及業務邏輯和複雜操作。它只配置視圖,處理使用者交互,最重要的是觀察和展示從ViewModel獲取的LiveData元素。
  2. ViewModel自動觀察view的Lifecycle狀態,在配置更改和其他Android Lifecycle事件期間保持一致性。view還要從Repository中獲取資料,這是由可觀察的LiveData提供的。 重要的是要瞭解ViewModel從不直接引用View,並且資料更新總是由LiveData實體完成的。 重要的是要瞭解ViewModel直接引用View,並且資料更新總是由LiveData實體完成的。
  3. Repository不是一個特殊的Android元件。它是一個簡單的類,沒有任何特定的實現,它負責從可用資源和資料庫中獲取資料到Web服務。 處理所有這些資料,通常將它們轉換為可觀察的LiveData並提供給ViewModel
  4. Room資料庫是一個SQLite映射庫,方便處理資料庫。它自動編寫大量樣板,在編譯時檢查錯誤,最重要的是它可以直接返回帶有可觀察的LiveData的查詢結果。

我相信你已經注意到我們已經談過很多關於可觀察(observables)了。觀察者模式是LiveData元素和Lifecycle感知元件的基礎之一。 一旦某個物件的狀態或資料更改了,觀察者模式就會通知觀察者列表。所以當Activity觀察一個LiveData實體時,它就會在資料修改後收到更新通知。

Android還推薦使用DI(依賴注入)系統(比如Google的 Dagger 2)或使用服務定位器模式(這比DI簡單,但沒有DI優點多)來整合其架構。在本教程中,我們不會講解DI或服務定位器,但Envato Tuts +有相關教程。 但是,請注意,在本系列的第二部分中將介紹Dagger 2和Android元件的一些特殊功能。

3.架構組件

我們必須深入到新元件的各個方面,才能真正理解並使用這種架構模型。但是,我們將不會在本教程中探討所有的細節。 在本教程中,由於每個元素的複雜性,我們將僅討論每個元素背後的一般思路,並查看一些簡化的代碼片段。 我們將嘗試使用足夠多的基礎知識來講解元件並讓您開始。但不要害怕,因為這個系列後面的文章將深入挖掘架構元件的所有特性。

Lifecycle感知組件

大多數Android應用程式元件都有生命週期Lifecycle,它們由系統自身直接管理。 直到最近,生命週期Lifecycle由開發者來管理,包括監控元件的狀態並相應地執行,在適當的時候初始化和結束任務。 然而,這很容易讓人困惑並犯錯誤。但是android.arch.lifecycle包的出現改變了這一切。

現在,Activities 和 Fragments有一個Lifecycle物件,這個物件可以被LifecycleObserver類觀察到,比如ViewModel或實現此介面的任何物件。 這意味著,被觀察物件的狀態變化後,觀察者將收到更新,例如Activity暫停或啟動時。 它還可以檢查被觀察物件的當前狀態。所以,現在,這些必須考慮框架生命週期的操作處理起來要容易得多。

LifecycleObserver reacts to LifecycleEvents

到目前為止,要創建符合此新標準的Activity 或 Fragment,您必須繼承LifecycleActivityLifecycleFragment。但是,由於Android團隊旨在將這些新工具與其框架完全集成,所以有時候是不必要的。

LifecycleObserver接收Lifecycle事件,並可以通過注解進行回應。不需要重新方法。

LiveData組件

LiveData元件是資料持有者,其包含可以被觀察的值。鑒於觀察者在LiveData產生實體期間提供了LifecycleLiveData將根據Lifecycle狀態做出回應。 如果觀察者的Lifecycle狀態為STARTEDRESUMED,則觀察者處於active狀態;否則,它是inactive的。

LiveData知道資料何時被更改,假如觀察者是active狀態,它就會收到更新。 LiveData的另一個有趣的特點是,如果觀察者處於Lifecycle.State.DESTROYED狀態,為了避免Activities 和Fragments觀察時出現記憶體洩漏,可以刪除觀察者。

LiveData value updating process

LiveData必須實現onActiveonInactive方法。

要觀察LiveData元件,必須調用observer(LifecycleOwner,Observer )

ViewModel組件

新架構的元件中最重要的一個類是ViewModel,它被設計為保存與UI相關的資料,在配置更改(如螢幕旋轉)時保持其完整性。 ViewModel能夠與Repository進行通信,從Repository中獲取LiveData,並且可被view觀察。 在配置更改後,ViewModel也不需要對Repository進行新的調用,從而優化了代碼。

ViewModel is tight to UI Lifecycle

要創建view層,需要繼承ViewModel類。

要從view層訪問,可以調用ViewProviders.of)Activity | Fragment).get(ViewModel :: class)。此工廠方法將返回一個新的ViewModel實例,或者根據需要獲取保留的實例。

Room組件

Android從一開始就支援SQLite資料庫;然而,為了讓SQLite工作,開發者一般需要編寫大量樣板代碼。另外,SQLite沒有保存POJO(純Java物件),並且在編譯時沒有檢查查詢。 Room元件就是用來解決這些問題的!它是一個SQLite映射庫,能夠持久化Java POJO,直接將查詢轉換為物件,在編譯時檢查錯誤,並從查詢結果生成LiveData可觀察者。 Room元件是帶有一些很酷的Android附加組件的物件關係映射庫

到目前為止,使用其他ORM Android庫能做的,大部分可以用Room元件來做。然而,其他ORM Android庫都沒有得到官方的支持,最重要的是其他ORM Android庫不能生成LifeData的結果。 Room庫完美地適合於所提出的Android架構上的持久層。

要創建一個Room資料庫,您需要一個@Entity才能持久化,這可以是任何Java POJO,一個@Dao介面進行查詢和輸入/輸出操作,還有一個繼承RoomDatabase@Database抽象類別

為你的工程增加架構元件

現在,要使用新的架構元件,您需要先將Google資源庫添加到build.gradle文件中。有關詳細資訊,請參閱官方指南

結語

正如你所見,Android提出的標準化架構涉及到了很多的概念。不要期望完全理解這些概念。 但是,您現在肯定有足夠的知識來瞭解架構背後的邏輯以及不同架構元件的作用。

我們討論了Android提出的標準化架構及其元件相關的大多數主題;但是,這篇文章無法涵蓋關於組件實現等功能的詳細細節,如Repository類和Dagger 2系統。 我們將在下一篇文章中探討這些話題。

再見!

Envato qr branded
关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.