dagger android 学习(二):AndroidInjector的使用

本系列博客主要用于本身学习积累,顺便帮助新手入门,若有问题,多多包涵。更详细的一些使用能够看看其余更加详细的博客。android

dagger android 学习(一):dagger基础使用
dagger android 学习(二):AndroidInjector的使用
dagger android 学习(三):ContributesAndroidInjector的进一步优化
dagger android 学习(四):基于dagger2的mvp架构git

在安卓实际开发中,咱们须要用到许多的activity以及fragment,这样咱们在进行依赖注入的以后都要进行一些重复的操做,好比在comonent中加入void inject(XXXActivity activity),以及在Activity中加入DaggerMyAppComponent.builder().build().inject(this),好在dagger2也提供了解决方法,让咱们不须要每次去写inject方法。github

添加依赖

implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
implementation 'com.google.dagger:dagger-android:2.21'
implementation 'com.google.dagger:dagger-android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.21'
复制代码

开始改造

AndroidInjector

建立一个接口继承AndroidInjector架构

@Subcomponent(modules = {
    AndroidInjectionModule.class,
})
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {

    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {
    }
}
复制代码

ActivityModule

实现用于绑定activity的Moduleapp

@Module(subcomponents = MainActivitySubcomponent.class)
public abstract class MainActivityModule {

    @Binds
    @IntoMap
    @ClassKey(MainActivity.class)
    abstract AndroidInjector.Factory<?> bindMainActivityInjectorFactory(MainActivitySubcomponent.Builder builder);
}
复制代码

AppComponent

@Component(modules = {
        AndroidInjectionModule.class,
        AndroidSupportInjectionModule.class,
        MainActivityModule.class,
        Main2ActivityModule.class,
})
public interface MyAppComponent {
    void inject(MyApplication application);

    @Component.Builder
    interface Builder{
        MyAppComponent build();
    }
}
复制代码

Application

application继承HasActivityInjector,实现inject方法,返回DispatchingAndroidInjector对象便可ide

public class MyApplication extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;


    @Override
    public void onCreate() {
        super.onCreate();
        DaggerMyAppComponent.builder().build().inject(this);
    }

    @Override
    public AndroidInjector<Activity> activityInjector() {
        return dispatchingAndroidInjector;
    }
}
复制代码

BaseActivity

baseActivity在super.onCreate以前调用AndroidInjection.inject(this),这样以后的activity就只须要继承它,直接可使用了,不须要再单独加入inject方法post

open class BaseActivity: AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
    }
}
复制代码

使用

使用的时候直接@inject就行,无需任何处理学习

public class MainActivity extends BaseActivity {

    @Inject
    A2 a2;

    @Inject
    C c;


    @Inject
    UserInfo userInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, Main2Activity.class));
            }
        });

        a2.someThingA();
        c.doSomethingC();

        userInfo.setAge("111");
        Log.e("DAGGER", userInfo.toString());
    }
}
复制代码

总结

dagger-android-support解决了每次新建Activity都须要在Activity中添加格子的inject方法,全部的inject都在BaseActivity中,这让代码简洁了不少。可是即便如此,仍是有较多一部分的模板代码,如例子中的ActivityModule和ActivitySubcomponent。每次新建一个Activity都须要建立这两个类,这样看起来仍是很麻烦,好在dagger2还提供了@ContributesAndroidInjector注解解决了这个问题。
demo地址:查看项目中的app模块优化

相关文章
相关标签/搜索