欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

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

发布时间:2023/12/31 Android 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 dagger android 学习(二):AndroidInjector的使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵。更详细的一些使用可以看看其他更加详细的博客。

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

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

添加依赖

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.Builderabstract class Builder extends AndroidInjector.Builder<MainActivity> {} } 复制代码

ActivityModule

实现用于绑定activity的Module

@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.Builderinterface Builder{MyAppComponent build();} } 复制代码

Application

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

public class MyApplication extends Application implements HasActivityInjector {@InjectDispatchingAndroidInjector<Activity> dispatchingAndroidInjector;@Overridepublic void onCreate() {super.onCreate();DaggerMyAppComponent.builder().build().inject(this);}@Overridepublic AndroidInjector<Activity> activityInjector() {return dispatchingAndroidInjector;} } 复制代码

BaseActivity

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

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

使用

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

public class MainActivity extends BaseActivity {@InjectA2 a2;@InjectC c;@InjectUserInfo userInfo;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {@Overridepublic 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模块

转载于:https://juejin.im/post/5cc7202fe51d456e31164a6c

总结

以上是生活随笔为你收集整理的dagger android 学习(二):AndroidInjector的使用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。