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

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的使用相关推荐

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

    本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵.更详细的一些使用可以看看其他更加详细的博客. 在安卓实际开发中,我们需要用到许多的activity以及fragment,这样我们在 ...

  2. android学习(二十一) 下载数据减少电池损耗

    高效的网络访问(优化下载) 使用无线网络下载数据是你的应用消耗电池潜在的重要原因之一.为了降低和网络有关的activity连接导致的电池消耗.你理解你的连接模型怎样影响无线硬件这是很关键的. 下面将介 ...

  3. 我的android学习二视图的控制者 Activity--Activity的生命周期

    据说成功的男人背后总会有一个管事的女人,同样的,android程序中华丽丽的界面下,也必须有一个控制着,它便是Activity. 首先,Activity是程序的一个组件,它提供一个或者多个的界面作为程 ...

  4. Android学习二:Http操作

    1.初步认识HTTP HTTP(Hypertext Transfer Protocol超文本传输协议)是网络应用层协议,建立在TCP/IP基础上,HTTP使用可靠的TCP连接,默认端口是80. 较常用 ...

  5. 【转】 Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner

    目录(?)[-] GridView Spinner GridView GridView是网格状布局,如图所示.在了解ListView后,很容易了解GridView.下面是例子的XML文件. <? ...

  6. Android学习之登陆界面设计(二)基本界面设计

    Android学习之登陆界面设计(二)基本界面设计 前提 绘图样式 - drawable bg_login_btn_submit.xml bg_login_panel_slide.xml bg_log ...

  7. Android OpenGL ES 学习(二) -- 图形渲染管线和GLSL

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  8. Android 学习之《第一行代码》第二版 笔记(二十三)Material Design 实战 —— 卡片式布局

    实现基础: Android 学习之<第一行代码>第二版 笔记(二十二)Material Design 实战 -- 悬浮按钮和可交互提示 卡片式布局 卡片式布局是 Materials Des ...

  9. Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    xml控件代码重用:include 如果我们定义一个控件,需要在不同的layout中重复使用,或者在同一个layout中重复使用,可以采用include的方式.例如定义my_button.xml如下 ...

最新文章

  1. log4j.logger java_log4j的多logger记录日志的简明使用
  2. Science:又一明星菌群可以调控肠道免疫?
  3. 美国韩国科学家纷纷开发出电子机器人“皮肤”,据称具有比人类更好的触觉...
  4. makefile多目录的.c 格式.cpp混合编译
  5. c++ 代码_C代码对汇编代码中声明的全局符号的访问方式详解
  6. c3p0 高并发mysql 连接sleep情况
  7. wenbao与acm技巧(必备知识)
  8. [Grid Layout] Place grid items on a grid using grid-column and grid-row
  9. 分析师视角:2018年的数据中心3大预测
  10. UUID 正在被 NanoID 取代?
  11. MySql | 为什么大家都在说 Select * 效率低
  12. python数据库操作封装_Python 封装一个操作mysql的类
  13. IT痴汉的工作现状16-职业发展
  14. 算法竞赛入门经典第六章(例题) B - Rails(涉及到栈的运用)
  15. 本部裁员、分部招人,科技公司的岗位都奔向了外地?
  16. day_05、内置函数、匿名函数
  17. ram_flash驱动
  18. JavaScript高级技巧
  19. asp小偷转html,ASP之XMLHTTP小偷程序的简单代码范例
  20. 基于主从博弈的电热综合能源系统动态定价与能量管理 主要做的是电热综合能源系统的动态定价问题,采用是主从博弈方法

热门文章

  1. Ruby on Rails 生成指定版本的 Rails 项目
  2. Win7搭建FTP服务器
  3. Aspose.Words 开发时遇到的问题
  4. JSON字符串和对象 的转换
  5. C# 之 获取文件名及拓展名
  6. 修改NLS_DATE_FORMAT的四种方式
  7. vim+linux+ctags+taglist+winmanager+grep+cscope+supertab+visualmark--ctags
  8. 关于Response.redirect和Response.End出现线程中止异常的处理
  9. all方法 手写promise_实现Promise.allSettled
  10. 面试题:如何实现一个深拷贝