Dagger2使用——結(jié)合MVP模式講解

更新:根據(jù)Dagger2官方最新配置,現(xiàn)在配置已經(jīng)不需要添加android-apt插件了,所以配置更簡(jiǎn)單了。即在下文中說(shuō)的Dagger2配置的第一步與第二步都可以省略了,第三步直接改成以下即可)。

    /*dagger2的配置*/
    annotationProcessor 'com.google.dagger:dagger-compiler:2.4'
    compile 'com.google.dagger:dagger:2.4'
    compile 'org.glassfish:javax.annotation:10.0-b28'

前言

相信大部分人在使用mvp模式的時(shí)候都會(huì)同時(shí)用到Dagger2框架,因?yàn)镈agger2能非常完美的解決mvp模式中存在的V層與P層之間的耦合。所以下面介紹Dagger2的使用也會(huì)結(jié)合我上一篇文章中的mvp模式來(lái)講解,還沒(méi)看上一篇文章的可以先去看看—— 帶你通俗易懂的理解——Android中的MVC與MVP。

Dagger2是什么?

Dagger2是一個(gè)在Android 和 Java中使用的依賴注入框架,現(xiàn)在由Google維護(hù),是基于Dagger的基礎(chǔ)上開發(fā)的,Dagger是由square開發(fā)的。Dagger2最大的作用就是解耦,例如ClassA中需要用到ClassB中的某個(gè)方法,但是又不想在ClassA中通過(guò)new的方式實(shí)例化ClassB,這時(shí)候Dagger2就很好的解決了這個(gè)問(wèn)題,Dagger2可以在ClassA中通過(guò)依賴注入的方式實(shí)例化ClassB,從而達(dá)到ClassA與ClassB的解耦。

Dagger2配置

1、 在項(xiàng)目的build.gradle中添加android-apt插件
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        //android-apt 插件
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'

    }
}
2、在app的build.gradle中添加apt插件的使用
//apt插件的使用
apply plugin: 'com.neenbedankt.android-apt'

android {
    ...
}

dependencies {
  ...
}
3、在app的build.gradle中添加Dagger2的依賴
...

android {
 ...
}

dependencies {
    //dagger2的配置
    compile 'com.google.dagger:dagger:2.4'
    apt 'com.google.dagger:dagger-compiler:2.4'
    compile 'org.glassfish:javax.annotation:10.0-b28'
}

Dagger2使用

經(jīng)過(guò)上面的配置就可以在項(xiàng)目中使用Dagger2了,這里舉的例子是基于我上篇mvp文章的基礎(chǔ)上的,還沒(méi)看上一篇文章的可以先去看看—— 帶你通俗易懂的理解——Android中的MVC與MVP。該Demo中V層中的Activity如下:

public class UserInfoActivity extends AppCompatActivity implements UserInfoView {

    private TextView    mTvName;
    private ProgressBar mPbLoading;
    UserInfoPresenter mUserInfoPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //find view
        mTvName = (TextView) findViewById(R.id.tv_name);
        mPbLoading = (ProgressBar) findViewById(R.id.pb_loading);

        //init
        mUserInfoPresenter = new UserInfoPresenter(this);
    }
    ...
}

也就是Activity中使用new的方式實(shí)例化Presenter,這樣就導(dǎo)致V層與P層耦合了,所以下面我就使用Dagger2將它們解耦。

先看看幾個(gè)注解的概念:

  • Module:在這里實(shí)例化目標(biāo)類(例子中就是UserInfoActivity類)需要依賴的對(duì)象。

  • Provides:標(biāo)注一個(gè)方法,該方法是用來(lái)提供實(shí)例化對(duì)象給目標(biāo)類的。

  • Inject:標(biāo)注實(shí)例化對(duì)象

  • Component:作為Module與目標(biāo)類之間的橋梁。

使用步驟:
1、創(chuàng)建帶有@Module注解的類,并利用@Provides標(biāo)注一個(gè)方法用來(lái)提供實(shí)例化對(duì)象給目標(biāo)類。

@Module //實(shí)例化目標(biāo)類需要依賴的對(duì)象
public class UserInfoActivityModule {

    UserInfoActivity mActivity;

    public UserInfoActivityModule(UserInfoActivity activity) {
        mActivity = activity;
    }

    @Provides //該方法是用來(lái)提供實(shí)例化對(duì)象給目標(biāo)類的
    UserInfoPresenter provideUserInfoPresenter() {
        return new UserInfoPresenter(mActivity);
    }
}

2、創(chuàng)建帶有@Component的接口,將它作為Module與目標(biāo)類之間的橋梁。

@Component(modules = UserInfoActivityModule.class) //作為Module與目標(biāo)類之間的橋梁
public interface UserInfoActivityComponent {

    /**
     * 定義注入的方法
     * @param activity
     */
    void inject(UserInfoActivity activity);
}

3、標(biāo)注實(shí)例化對(duì)象,并將Module與目標(biāo)類聯(lián)系起來(lái)。
注意:DaggerUserInfoActivityComponent是Rebuild項(xiàng)目后根據(jù)定義的Component的類名自動(dòng)生成的,所以這里先要Rebuild一下項(xiàng)目再使用。

public class UserInfoActivity extends AppCompatActivity implements UserInfoView {
    @Inject //標(biāo)注實(shí)例化對(duì)象
    UserInfoPresenter mUserInfoPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        //將Module與目標(biāo)類聯(lián)系起來(lái)
        DaggerUserInfoActivityComponent
                .builder()
                .userInfoActivityModule(new UserInfoActivityModule(this))
                .build()
                .inject(this);
    }
...
}

通過(guò)上面的三步其實(shí)就只實(shí)現(xiàn)了UserInfoActivityModule = new UserInfoActivityModule(this),看起來(lái)是復(fù)雜了許多,但是它非常完美的解決了mvp模式中存在的V層與P層之間的耦合。就好比使用mvp比使用mvc多了很多代碼,但大家還是會(huì)使用mvp模式一樣的道理。

Demo地址:MVP-Pattern

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 寫在前面:我目前就職于阿里巴巴-菜鳥,團(tuán)隊(duì)目前缺人,招聘java和客戶端開發(fā),招聘對(duì)象為:社招和19屆畢業(yè)的校招生...
    littleKang閱讀 115,554評(píng)論 91 745
  • 我已死, 接下來(lái)便是新生! 所有的舊的, 我都不要! 我將重新創(chuàng)造, 不枉人世一遭!
    聚一粒沙造一座塔閱讀 220評(píng)論 1 2
  • lstm structure
    a711df54486d閱讀 246評(píng)論 0 0
  • 大學(xué)四年,記憶中,只有一個(gè)寒假我回家過(guò)年了。 因?yàn)閷W(xué)校距離家,實(shí)在是太遠(yuǎn)了。當(dāng)然,最重要的一個(gè)原因,寒假也好,暑假...
    全職寫作的維憶閱讀 1,809評(píng)論 80 46

友情鏈接更多精彩內(nèi)容