android經典簡單小項目:android開發三大框架哪個用的多

Dagger 和 Koin 無疑是 Android 中最流行的兩個依賴注入框架。這兩個庫具有相同的用途,而且看起來非常相似,但它們在底層的工作方式卻非常不同。

那麼 Hilt 是什麼呢?Hilt 是一個內部使用 Dagger 的庫,只是簡化了它的用法,因此我在這裡所說的有關 Dagger 的內容也適用於 Hilt。在本文中,我不會告訴您應該選擇哪個庫。相反,我想向您展示它們的本質區別以及這些差異對您的應用造成的影響。

Dagger

如果我們希望 Dagger 提供某個類的實例,我們要做的就是在構造函數中添加 @Inject 註解。

Android註解三大框架Dagger、Hilt和Koin有何不同?

添加這個註解後,Dagger 會在構建時為這個類生成一個 Factory。在該用例下,由於它的類名是 CompositeAdapter, 它會生成一個名為 CompositeAdapter**_**Factory的類。

此類包含創建 CompositeAdapter 類的實例所需的所有信息。

Android註解三大框架Dagger、Hilt和Koin有何不同?

如你所看到該工廠類實現了 get() 並返回了一個新的 CompositeAdapter 實例。這實際上是此類實現的 Provider <T> 接口中指定的方法。其他類可以使用 Provider<T> 接口來獲取一個類的實例。

Android註解三大框架Dagger、Hilt和Koin有何不同?

如果我們用 Hilt 代替 Dagger 呢?

在這個例子中,沒有任何區別。Hilt 是一個內部使用 Dagger 的庫,我向你展示的類是由 Dagger 生成的。如果您使用 Hilt,它確實為我們生成了一些額外的類,這些類簡化了 Dagger 的使用,並減少了我們需要編寫的樣板代碼的數量。但核心部分保持不變。

Android註解三大框架Dagger、Hilt和Koin有何不同?

Koin

Koin 與 Dagger 以及 Hilt 相比,管理依賴項的方法完全不同。要在 Koin 中註冊依賴項,我們不會使用任何註解,因為Koin不會生成任何代碼。相反,我們必須為模塊提供工廠,這些模塊將用於創建項目中所需的每個類的實例。

Koin 將這些工廠類的引用添加到 InstancesRegistry 類中,該類包含對我們編寫的所有工廠的引用。

Android註解三大框架Dagger、Hilt和Koin有何不同?

該 map 中的 key 是類的全名或使用命名參數時提供的名稱。對應的值是我們編寫的工廠,將用於創建類的實例。

要獲得依賴關係,我們需要調用 get() (比如在一個工廠類中) 或者通過在 activities 或 fragments 中調用 inject() 委託屬性 ,從而懶加載 get()。get()方法將查找為給定類型的類註冊工廠,並將其注入其中。

Android註解三大框架Dagger、Hilt和Koin有何不同?

有什麼影響?

Dagger 生成代碼來提供依賴,而 Koin 不生成代碼,這實際上帶來了一些影響。

1. 錯誤處理

因為Dagger 是一個編譯時依賴注入框架,如果我們忘記提供某些依賴,我們幾乎會立即知道我們的錯誤,因為我們的項目將構建失敗。

例如,如果我們忘記向構造函數的 CompositeAdapter 中添加 @Inject 註解,並嘗試將其注入 fragment 中,則構建將失敗,並顯示適當的錯誤,確切地告訴我們出了什麼問題。

Android註解三大框架Dagger、Hilt和Koin有何不同?

在 Koin 中的情況有所不同,因為它不會生成任何代碼。如果我們忘記為 CompositeAdapter 類添加工廠,應用將會成功構建,但是會拋出 RuntimeException 一旦我們請求獲取這個類的實例。它可能會在應用啟動時發生,因此我們可能會立即注意到它,但也可能稍後在其他屏幕上或當用戶執行某些特定操作時發生。

Android註解三大框架Dagger、Hilt和Koin有何不同?

2. 對構建時間的影響

Koin 不生成任何代碼的優點是:它對我們的構建時間的影響要小得多。Dagger 需要使用註解處理器來掃描代碼並生成適當的類。這可能需要一些時間,可能會減慢我們的構建。

3. 對運行時性能的影響

從另一方面來說,因為 Koin 在運行時解析依賴項,所以它的運行時性能稍差一些。

Android註解三大框架Dagger、Hilt和Koin有何不同?

到底相差多少呢?為了估算性能差異我們可以使用該庫,其中 Rafa Vázquez 基於不同的設備上測量並比較了這兩個庫。測試數據的編寫方式可以模擬多個級別的傳遞依賴關係,因此它不僅僅是具有 4 個類的虛擬應用程序。

Android註解三大框架Dagger、Hilt和Koin有何不同?

如您所見,Dagger 對啟動性能幾乎沒有影響。另一方面,在 Koin 中,我們可以看到它花費了很多時間。在 Dagger 中注入依賴也比在 Koin 中快一些。

總結

正如我在本文開始時所說的,我這裡的目標不是告訴您要使用哪個庫。我在兩個不同的大項目中都使用了 Koin 和 Dagger。老實說,我認為選擇 Dagger 還是 Koin 並不重要,重要的是能夠讓你編寫乾淨、簡單且易於單元測試的代碼。我認為所有的庫:Koin,Dagger 和 Hilt 都達到了這個目的。

所有這些庫都有自己的優勢,我希望了解它們在底層是如何工作的,能夠幫助您自己決定哪種庫最適合您的應用。

最後

在這裡我分享一份由大佬親自收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料

這些都是我現在閑暇時還會反覆翻閱的精品資料。裏面對近幾年的大廠面試高頻知識點都有詳細的講解。相信可以有效地幫助大家掌握知識、理解原理,幫助大家在未來取得一份不錯的答卷。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/225731.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:46
下一篇 2024-12-09 14:46

相關推薦

發表回復

登錄後才能評論