Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> 史上最通俗易懂的Android Dagger入門教程

史上最通俗易懂的Android Dagger入門教程

編輯:Android資訊

簡介

Dagger2是Dagger1的分支,早期有square開發,現在由谷歌公司接手。
他要解決問題和核心是:利用生成和寫的代碼混合達到看似所有的產生和提供依賴的代碼都是手寫的樣子。

官方Github地址:https://github.com/google/dagger

官方主頁:http://google.github.io/dagger/

好處

  1. 依賴注入的配置獨立於初始化地方,更改配置方便。比如:在MVP架構中,我們寫了一個TaskPresenter,但是他在TaskActivity和TaskDetailActivity中都使用了,正常情況是不是我們要在這兩個地方都做實例化,後期可能還有更多的界面,但是我們如果使用了依賴注入,我們只需要在這兩個地方定義一個TaskPresenter的變量,然後加一個注解,這樣初始化在統一的地方,以後更改是不是很方便。
  2. 我們可以注入一些依賴的模擬實驗。比如:我們的app顯示的數據來自網絡,但是後台接口還沒有寫好,但是我們對數據層進行了抽象化,那我們就可以寫一個本地json模擬是接口返回的數據,就可以測試了。
  3. app的注入組件他不知道在什麼地方,初始化完全有我們告訴他在什麼地方注入等

結構圖

首先大概解釋下Dagger中幾個角色(或者說是幾個注解):

@Inject:這個很簡單了,通常是在需要注入的地方添加這個依賴。比如:MainActivity要使用LocalManager實例,那我們就在要使用的地方定義一個成員變量

@Inject
LocationManager locationManager;

注意:不能是private修飾的

@Module:就是真正提供依賴的類了。所以我們定義一個類,用@Module注解,這樣Dagger在構造類的實例的時候,就知道從哪裡去找到需要的 依賴。modules的一個重要特征是它們設計為分區並組合在一起(比如說,在我們的app中可以有多個組成在一起的modules)。所以我們這裡可以定義一個AppApplication類用來提供全局依賴,可以是ApiService,Retrofit,OKHttp,LocalManager,Context等

@Module
public class AppApplicationModule {
    ...
}

@Provides:就是寫在Module中某些方法上,表示這個方法提供依賴

@Provides @Singleton LocationManager provideLocationManager() {
    return (LocationManager) application.getSystemService(LOCATION_SERVICE);
}

@Component: 是@Inject和@Module的橋梁,它的主要作用就是連接這兩個部分。 Components可以提供所有定義了的類型的實例。

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

基本的注解我就講解到這裡,下面寫一個小實例

基本配置

首先創建一個Android項目,然後在項目的build.grade,添加android-apt依賴

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

然後在app的build.gradle添加

apply plugin: 'com.neenbedankt.android-apt'

然後在添加依賴

dependencies {
    ...
    apt "com.google.dagger:dagger-compiler:2.2"
    provided 'org.glassfish:javax.annotation:10.0-b28'
    compile "com.google.dagger:dagger:2.2"
    ...
}

到這一步可以build下,看看配置是否正確,我們下面要做的就是上面說的,給MainActivity提供LocalManager,對,就這麼一點,不然寫多了大家又懵逼了

首先創建一個AppApplication類,他是一個Application子類,需要在清檔文件配置,之所有要創建他是因為,我們要在這裡提供一些全局依賴

創建Application

public class AppApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
    }
}

記得在清單文件配置喲~

創建AppApplicationModule

上面說了這是一個真正提供依賴的類,其中一些方法要用@Provides修飾

@Module
public class AppApplicationModule {
    private final Context context;
    public AppApplicationModule(Context context) {
        this.context=context;
    }
    //標示這個方法可以提供LocationManager
    @Provides
    @Singleton
    LocationManager provideLocationManager() {
        return (LocationManager) context.getSystemService(LOCATION_SERVICE);
    }
}

創建ApplicationComponent

同樣也說了,他是Module和Inject之間的橋梁,我們幫他創建到了AppApplication內部

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

在AppApplication中注冊依賴

public class AppApplication extends Application {
    private ApplicationComponent component;
    @Override
    public void onCreate() {
        super.onCreate();
        component = DaggerAppApplication_ApplicationComponent.builder().appApplicationModule(new AppApplicationModule(this)).build();
        component.inject(this);
    }
    @Singleton
    @Component(modules = AppApplicationModule.class)
    public interface ApplicationComponent {
        void inject(MainActivity demoActivity);
        void inject(AppApplication application);
    }
    public ApplicationComponent component() {
        return component;
    }
}

在MainActivity注冊

public class MainActivity extends AppCompatActivity {
    //可以看到我們沒有顯示的初始化LocationManager
    @Inject
    LocationManager locationManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv_info = (TextView) findViewById(R.id.tv_info);
        //注解依賴
        ((AppApplication) getApplication()).component().inject(this);
        tv_info.setText(locationManager.toString());
    }
}

好這就是一個最最基本的Dagger注入例子了,下一篇我們來詳細分析下他的實現原理或者再寫一個MVP架構例子,感謝你的閱讀。源代碼下載地址:https://github.com/lifengsofts/AndroidDagger2

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved