Android实战——Dagger2一场老板与员工的故事会

Posted 张丽心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android实战——Dagger2一场老板与员工的故事会相关的知识,希望对你有一定的参考价值。


本篇文章主要包含以下内容

  • 新的公司开张啦:前言
  • 新项目开会讨论:Dagger2的介绍
  • 新员工入职(Hensen):Dagger2基本使用(@Component、@Inject、@Module、@Named)
  • 新员工入职(Jenny):Dagger2的模块化开发(@Module、@Singleton)
  • 老板发火了(Boss):Dagger2的全局单例使用(@dependencies、@Scope)
  • 员工们都辞职了:源码下载、结语

终于到了Hensen老师吹水的时间了,可能各位看惯了文字描述的Dagger2,看久了就会视觉疲劳,因为我也是这样的过来的,所以今天换一种方式,编一个故事会的形式来让观众们换换口味。Dagger2不是一般的难,而是很难,作为新手级别的Hensen老师只能为你们先去Dagger2探探险,一探就是好几天,下面我就把探险的结果告诉大家

终于我们的公司开张啦,新公司命名就叫90后网络科技有限公司吧,下面是人物介绍

  1. Boss:老板,大神级别的人物
  2. Hensen:元老级员工,负责项目的用户模块
  3. Jenny:骨灰级员工,负责项目的网络模块

Boss:今天刚找到一个好项目,嘿嘿,融资了两百万,是时候招人进来把项目做出来啦,我该好好想想项目用什么框架好呢。看最近Dagger2那么火, 不如就它了

1、Dagger2的介绍

Dagger2是一款依赖注入框架,依赖注入框架对MVP架构来说,是最好的解耦工具,不仅为了让你的代码更有模块化,而且更有条理性

2、Dagger2的依赖

项目中使用到的依赖,如果你是Gradle2.2以下的,需要添加apt插件等,这里就不演示了,Gradle2.2是很久之前了,相信很多人都不用了

3、Dagger2的基本原理

技术分享图片

这里可以简单的理解为多个模块(Module)通过Component直接注入到Activity中,我们可以把多个Module比喻为成为不同的针药水,Component比喻为针管,Container比喻为屁股,我们通过不同针药水混合后放入到针管,然后打到我们的屁股上,这就是Dagger2的基本原理

4、Dagger2的注解

这里提前简单的介绍我们需要用到的注解

  1. @Inject:通常在需要依赖的地方使用这个注解,也就是针水打进屁股的过程
  2. @Module:Modules类似于我们的模块,也就是成分不同的针药水,提供各种实例和对象
  3. @Provides:在Modules中,我们定义的方法是用这个注解,以此来告诉Dagger2我们想要提供哪些实例和对象,也就是成为不同的针药水的厂家
  4. @Component:注入器,是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分,也就是我们的针管+针头
  5. @Scope:Dagger2使用的作用域,局部还是全局

5、Dagger2三步曲

  1. 创建Module,提供使用实例
  2. 创建Component,连接Module与Activity之间的桥梁
  3. Inject注入,开始在Activity中进行注入

Hensen:老板好啊,今天很高兴能来到90后网络科技有限公司,请问有什么任务吩咐吗?

Boss:来,把Dagger2作为我们新项目的框架,你负责用户模块,今晚你就把它做完

Hensen:好的,老板,我这就去工作了

Hensen习惯了MVC的框架模式,所以他一来就把MVC和Dagger2的框框先搭建了起来

技术分享图片

1、主体逻辑:首先是定义几个Controller来作为主要的功能逻辑

2、Module创建:刚学习完Dagger2的Hensen,知道Dagger2依赖注入的思路,就跟自己去打屁股针是一样道理的,现在需要针药水和针管针头,来将药水打入我们的屁股中,这里的屁股就是Activity,即将Controller打入Activity中

3、Conmponet创建:准备好药水,下面准备针管针头

4、Inject的注入:这里都准备好了,这时候千万要注意记得Rebuild一下项目,它会生成我们需要的代码,那么就可以开始打针了

运行程序,控制台成功的打印出信息

技术分享图片

5、Named的使用:做到这里,Hensen已经把大体的都做完了,剩下一个UserController 不知道怎么下手,因为他有两个构造方法,Dagger2会去默认会去调用哪个构造方法呢,于是Hensen又开始找资料了,他发现可以这么做,他使用@Named方法,提供两个不同构造方法

那么在使用的时候的也要相对应相同的名字

运行程序,控制台打印出信息

技术分享图片

6、自定义Named的使用:Hensen是个追求完美的人,觉得程序还可以把这个Named再完善一下,于是它查看Named的源码,照抄了一份作为自己的注释

那么使用起来看上去就很舒服了,效果和上面是一样的,只不过换一种写法

这样就 没问题了,Hensen的工作基本上已经完成了,下面就可以给老板交付任务了

Jenny:老板您好,我是Jenny,今天很高心来到公司,我个人比较擅长网络这块,有什么任务可以吩咐给我吗?

Boss:这样啊,那你写个网络模块,让Hensen的用户管理连上网呗,对了最好用OkHttp

Jenny:恩,好的,老板,那我先去工作了

由于Jenny的Dagger学得不好,所以只能去阅读Hensen的代码,然后根据意思模拟出自己的一套Dagger出来

技术分享图片

1、主体逻辑:首先是创建负责网络模块的主体逻辑,提供get和post的方法

2、Module的创建:这里就是为Hensen准备好的Controller实例,直接把这个Module添加进去就能用

一开始不是很懂的Jenny,让Hensen直接用自己的Module,它的意思如下面所示,可以直接把自己Module嵌入到Hensen中去,然而Hensen为了不得罪新同伴,就增加进去了,它知道这样做不好,同时也劝Jenny把Component也写出来

3、Componet的创建:让这个模块注入到另一个Activity中,这里得注意,如果其他Component使用的inject方法中也传递LoginActivity的话,这里就会报错,所以一个Componet能对应多个inject到Activity中,但是不能重复

4、模块使用:Hensen收到了Jenny做好的网络模块后,直接把它加入LoginActivity中就好啦,注意记得重新Rebuild一次才会生成对应的DaggerHttpComponet

5、Singleton的使用:Hensen作为老员工,知道OkHttp不能重复创建,让Jenny把它进行单例,Jenny听起来也时很有道理,于是就查资料,如何在Dagger2进行单例,它根据资料查到的方法如下,对Module中提供单例的方法中添加@Singleton字样,然后对使用它的Componet添加@Singleton字样即可,这样就完成了

6、但是很快,Hensen又发现了令人头疼的事情,由于UserActivity使用的是UserComponet、LoginActivity使用的是HttpComponet的,它们创建出来的HttpClient是不同对象。只有在同一个Componet中的Activity使用HttpClient才是单例。这是因为Singleton是跟Componet绑定在一起的,不同的Componet表示的肯定是不同的单例,所以没办法。Hensen是通过打印地址检查出问题的

Boss:Jenny,你这个单例不能这样子,在不同Componet会出现不同的单例,你得把它放到Application中去,这样才是全局才是只有一个

Jenny:老板,这。。我不会啊,怎么办?

Boss:哎,看来还是我得出场了

老板也开始写出了一套App级别的Dagger出来,并提供okHttp单例出来,大Boss来啦

技术分享图片

1、Module的创建:老板先从需求开始写,需要什么就给什么,而且是@Singleton单例

2、Component的创建:老板也懂得Dagger2,所以毫不犹豫进行第二步

3、Application创建:老板深知只有在Application的变量才会整个程序被实例化一次,所以放在这里的OkHttpClient全局是单例是完全没错的,注意记得重新Rebuild一次才会生成对应的DaggerAppComponet

当然,老板怎么可能犯小错误呢,记得在Application中注册该MyApplication

4、Scope的创建:老板亲自写了个Scope,跟我们说,以后就别用Singleton了,用我提供的ActivityScope,这样单例才会生效。这里是因为Singleton也是个Scope,Scope和Scope之间不能冲突,也就是老板使用了Singleton,我们再使用就会报错,我们必须使用老板提供另外的ActivityScope才不会报错

5、Jenny也偷偷的把自己提供的OkHttpClient注释掉了,这里这样做为了后面的程序不报错

6、dependencies的使用:老板写好了之后,我们就要开始使用老板的,Hensen作为熟悉Dagger2的人,当然是先用为妙,下面是Hensen修改的内容,这里需要注意要事先Rebuild一下老板的模块,才能使用.appComponet(myApplication.getAppComponet())

7、不会Dagger2的Jenny也开始模仿Hensen的写法,开始修改自己的代码,下面是Jenny修改的代码

8、Hensen顺便也把Jenny写的嵌入到自己的Activity中

9、最后Hensen通过打印信息发现,老板的确实是单例啊,终于解决了不同Component中不会出现不同的单例对象了

技术分享图片

Hensen:老板我要辞职了,天天加班,工资给得又少,工作量又那么多,而且这个Dagger2太烦了,搞得我头皮发麻
Jenny:老板,我不会Dagger2,我也要辞职

1、源码下载

2、结语

学习完Dagger2真的是一脸懵逼,如果没有一定的思维能力还是挺难的,雅思最后员工都忍受不了Dagger2这么复杂的东西,直接辞职了,哈哈哈哈,所以说选择框架很重要,如果各位没有心思研究新技术,还是先放着Dagger2让它自由去吧,缺一个也不缺,还是去学习性价比比较高框架吧

回顾本节课内容:

    1. @Module、@Component、@Inject基本使用(Everyone)
    2. @Named创建不同的参数的实例(Hensen)
    3. @Singleton完成单个Component的实例(Jenny)
    4. @Singleton和@Scope在不同Component中保持同一个实例(Boss) 

以上是关于Android实战——Dagger2一场老板与员工的故事会的主要内容,如果未能解决你的问题,请参考以下文章

Android单排上王者系列之Dagger2注入原理解析

C++基础实战:职工管理系统

机械ERP系统对企业老板及员工的好处是什么?

我靠加班把老员工弄走了,昨天老板又给我画饼,一天天浑浑噩噩,Android开发究竟还有前途吗?

C++项目实战:基于多态的职工管理系统(源码)

Dagger2实战(详细)