08.Dagger-Android的使用

关于Dagger2

  • Dagger基础用法
  • 对注解的分类讲解——Inject部分
  • 对注解的分类讲解——Module部分(一)
  • 对注解的分类讲解——Component部分
  • 对注解的分类讲解——Module(二)
  • 对注解的分类讲解——Module(三)
  • 对Dagger中几个类的说明
  • Dagger-Android的使用

前言

在使用Dagger2进行Android开发时,不可避免的问题是我们需要实例化一些Android系统的类,比如Activity或者Fragment。最理想的情况是Dagger能够创建所有需要依赖注入的对象,但事实上,我们不得不在容器的声明周期中添加大量的重复性代码,这些模版代码虽然相近但是却又不能封装到基类里面,那应该怎么呢?

正因为有着种种问题所以就有了Dagger-Android的出现。

具体实现

引入依赖

由于需要使用到DaggerAndroid相关的一些内容,就需要引入dagger-android的依赖。

// dagger的引用
implementation 'com.google.dagger:dagger:2.24'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
// 如果要使用dagger-android则引用
implementation 'com.google.dagger:dagger-android:2.24'
implementation 'com.google.dagger:dagger-android-support:2.24'
// if you use the support libraries
annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'

创建Activity基类

一般的我们都需要将Activity的共同部分抽离出来封装到BaseActivity中去:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        // 一行代码建立连接,其背后的逻辑都由DaggerAndroid所封装
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }
}

创建BaseActivityComponent:

// 一定要引入AndroidInjectionModule
@Subcomponent(modules = {
        AndroidInjectionModule.class,
})
// 接口继承AndroidInjector,将需要进行绑定的BaseActivity作为泛型传入
public interface BaseActivityComponent extends AndroidInjector {
    
    // 使用Factory的方式实现构造
    // 在继承的AndroidInjector.Factory接口中,已经将方法实现,所以这里不需要在添加其它方法
    // 注意在之前的版本中是可以通过Builder的方式实现构造的,但是现在已经被废弃
    @Subcomponent.Factory   
    interface Factory extends AndroidInjector.Factory {

    }

}

建立与Application的连接

首先来定义Application的Component:

// 一定要引入AndroidInjectionModule和AndroidSupportInjectionModule
// ActivityManagerModule是作为对ActivityModule进行管理的一个Module
@Component(modules = {
        AndroidInjectionModule.class,
        AndroidSupportInjectionModule.class,
        ActivityManagerModule.class
})
public interface BaseApplicationComponent {
    void inject(BaseApplication application);
}

创建BaseApplication:

// 实现HasAndroidInjector接口
public class BaseApplication extends Application implements HasAndroidInjector {

    // 将DispatchingAndroidInjector注入
    @Inject
    DispatchingAndroidInjector dispatchingAndroidInjector;

    @Override
    public void onCreate() {
        super.onCreate();
        // 建立连接
        DaggerBaseApplicationComponent.create().inject(this);
    }

    // 提供给HasAndroidInjector做处理
    @Override
    public AndroidInjector androidInjector() {
        return dispatchingAndroidInjector;
    }
}

创建ActivityModule管理类

@Module(subcomponents = {
        BaseActivityComponent.class
})
public abstract class ActivityManagerModule {

    // 所有需要进行注入操作的Activity只要添加对应的两行代码即可
    @ContributesAndroidInjector(modules = FirstActivityModule.class)
    abstract FirstActivity contributeFirstActivitytInjector();
}

创建业务的Activity

public class FirstPresenter {
    public void log() {
        Log.d("Dagger测试", "获取到MainPresenter了");
    }
}
// 实现业务的Module提供所要的依赖
@Module
public class FirstActivityModule {
    @Provides
    FirstPresenter providerMainPresenter() {
        return new FirstPresenter();
    }
}
// 继承BaseActivity,无需实现DaggerXXX类的注册过程
public class FirstActivity extends BaseActivity {

    @Inject
    FirstPresenter mFirstPresenter;

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

        mFirstPresenter.log();
    }
}

这样就完成了通过DaggerAndroid实现的依赖注入,这种方式将Dagger的注入实现过程隐藏了起来,在外部只需要知道所要调用的对象是什么就可以了。

关于Dagger和DaggerAndroid之间的选择

怎么说呢,相比于DaggerAndroid来说Dagger用的时间更久,或者说DaggerAndroid一直知道有这个东西却没有去学习和使用它。

关于在项目中的使用,我还是更加倾向于Dagger,虽然它会在业务Activity中新创建很多东西,但是对于一般的开发者来说Dagger更容易理解和接受,所以我在进行框架搭建的时候会以Dagger作为注入对象,可能后期会使用DaggerAndroid去进行改造也说不定。

关于Dagger和DaggerAndroid之间的选择还是看开发者自己吧,觉得哪一种更加方便就使用哪一种。

你可能感兴趣的:(08.Dagger-Android的使用)