中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

andriod的Dagger怎么用

發布時間:2022-03-30 10:15:49 來源:億速云 閱讀:172 作者:iii 欄目:移動開發

這篇文章主要介紹了andriod的Dagger怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇andriod的Dagger怎么用文章都會有所收獲,下面我們一起來看看吧。

剛開始學習軟件工程的時候,我們經常會碰到像這樣的事情:

軟件應該符合 SOLID 原則。

但這句話實際是什么意思?讓我們看看 SOLID 中每個字母在架構里所代表的重要含義,例如:

  • S - 單職責原則

  • O - 開閉原則

  • L - Liskov 替換原則

  • I - 接口分離原則

  • D - 依賴反轉原則 這也是依賴注入(dependency injection)的核心概念。

簡單來說,我們需要提供一個類,這個類有它所需要的所有對象,以便實現其功能。

andriod的Dagger怎么用

概述

依賴注入聽起來像是描述非常復雜的東西的一個術語,但實際上它很簡單,看下面這個例子你就明白了:

class NoDependencyInjection {   private Dependency d;   public NoDependencyInjection() {     d = new Dependency();   } } class DependencyInjection {   private Dependency d;   public DependencyInjection(Dependency d) {     this.d = d;   } }

正如我們所見,***種情況是我們在構造器里創建了依賴對象,但在第二種情況下,它作為參數被傳遞給構造器,這就是我們所說的依賴注入(dependency  injection)。這樣做是為了讓我們所寫的類不依靠特定依賴關系的實現,卻能直接使用它。

參數傳遞的目標是構造器,我們就稱之為構造器依賴注入;或者是某個方法,就稱之為方法依賴注入:

class Example {   private ConstructorDependency cd;   private MethodDependency md;   Example(ConstructorDependency cd) {     this.cd = cd; //Constructor Dependency Injection   }   public setMethodDependency(MethodDependency md) {     this.md = md; //Method Dependency Injection   } }

要是你想總體深入地了解依賴注入,可以看看由 Dan Lew 發表的精彩的演講,事實上是這個演講啟迪了這篇概述。

在 Android 平臺,當需要框架來處理依賴注入這個特殊的問題時,我們有不同的選擇,其中最有名的框架就是 Dagger 2。它最開始是由 Square  公司(LCTT 譯注:Square 是美國一家移動支付公司)的一些很棒的開發者開發出來的,然后慢慢發展成由 Google 自己開發。首先開發出來的是  Dagger 1,然后 Big G 接手這個項目發布了第二個版本,做了很多改動,比如以注解(annotation)為基礎,在編譯的時候完成其任務。

導入框架

安裝 Dagger 并不難,但需要導入 android-apt 插件,通過向項目的根目錄下的 build.gradle 文件中添加它的依賴關系:

buildscript{   ...   dependencies{     ...     classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’   } }

然后,我們需要將 android-apt 插件應用到項目 build.gradle 文件,放在文件頂部 Android application  那一句的下一行:

apply plugin: ‘com.neenbedankt.android-apt’

這個時候,我們只用添加依賴關系,然后就能使用庫及其注解(annotation)了:

dependencies{     ...     compile ‘com.google.dagger:dagger:2.6’      apt ‘com.google.dagger:dagger-compiler:2.6’     provided ‘javax.annotation:jsr250-api:1.0’ }

需要加上***一個依賴關系是因為 @Generated 注解在 Android 里還不可用,但它是原生的 Java 注解。

Dagger 模塊

要注入依賴,首先需要告訴框架我們能提供什么(比如說上下文)以及特定的對象應該怎樣創建。為了完成注入,我們用 @Module  注釋對一個特殊的類進行了注解(這樣 Dagger 就能識別它了),尋找 @Provide 注解的方法,生成圖表,能夠返回我們所請求的對象。

看下面的例子,這里我們創建了一個模塊,它會返回給我們 ConnectivityManager,所以我們要把 Context  對象傳給這個模塊的構造器。

@Module public class ApplicationModule {   private final Context context;   public ApplicationModule(Context context) {     this.context = context;   }   @Provides @Singleton   public Context providesContext() {     return context;   }   @Provides @Singleton   public ConnectivityManager providesConnectivityManager(Context context) {     return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);   } }

Dagger 中十分有意思的一點是簡單地注解一個方法來提供一個單例(Singleton),就能處理所有從 Java 中繼承過來的問題。

組件

當我們有一個模塊的時候,我們需要告訴 Dagger  想把依賴注入到哪里:我們在一個組件(Component)里完成依賴注入,這是一個我們特別創建的特殊注解接口。我們在這個接口里創造不同的方法,而接口的參數是我們想注入依賴關系的類。

下面給出一個例子并告訴 Dagger 我們想要 MainActivity 類能夠接受  ConnectivityManager(或者在圖表里的其它依賴對象)。我們只要做類似以下的事:

@Singleton @Component(modules = {ApplicationModule.class}) public interface ApplicationComponent {   void inject(MainActivity activity); }

正如我們所見,@Component 注解有幾個參數,一個是所支持的模塊的數組,代表它能提供的依賴。這里既可以是 Context 也可以是  ConnectivityManager,因為它們在 ApplicationModule 類中有聲明。

用法

這時,我們要做的是盡快創建組件(比如在應用的 onCreate 階段)并返回它,那么類就能用它來注入依賴了:

為了讓框架自動生成 DaggerApplicationComponent,我們需要構建項目以便 Dagger  能夠掃描我們的代碼,并生成我們需要的部分。

在 MainActivity 里,我們要做的兩件事是用 @Inject 注解符對想要注入的屬性進行注解,調用我們在  ApplicationComponent  接口中聲明的方法(請注意后面一部分會因我們使用的注入類型的不同而變化,但這里簡單起見我們不去管它),然后依賴就被注入了,我們就能自由使用他們:

public class MainActivity extends AppCompatActivity {   @Inject   ConnectivityManager manager;   @Override   protected void onCreate(Bundle savedInstanceState) {     ...     ((App) getApplication()).getComponent().inject(this);   } }

關于“andriod的Dagger怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“andriod的Dagger怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汉阴县| 泸水县| 东山县| 天柱县| 青铜峡市| 精河县| 通榆县| 乡城县| 方山县| 林口县| 嘉荫县| 马龙县| 武山县| 信宜市| 冀州市| 和静县| 仪征市| 鄯善县| 义乌市| 汶川县| 深州市| 井陉县| 邹平县| 新密市| 聊城市| 垫江县| 临夏市| 沙雅县| 陕西省| 兰州市| 同德县| 九龙城区| 蒙自县| 正定县| 周至县| 武功县| 永胜县| 庆元县| 唐山市| 拉萨市| 竹山县|