详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之四
来源:互联网 发布:安装人工智能计算器 编辑:程序博客网 时间:2024/06/07 01:49
前面我们分别将MVP和Dagger模块的构成,这篇我们说一下一些小细节以及最后总结一下。
关于MVP这里就没什么好说的,一个很通俗易懂的设计架构,使用起来也很方便,应该对大家没什么难度,这里主要就说一下Dagger2的一些细节问题吧!
可以看到我在该项目中使用了@Singleton标签,表示单例。又因为依赖与被依赖的@Scop不能相同,我又自定义了一个@SingleUserModel,这样就可以得到单例了吗?
我们运行一下这个项目,看log信息(log的tag设置为“zyj”):
在第一个界面,点击LOGIN按钮,得到打印信息:
点击NEXT进入下个页面,然后在点击DETAIL,得到打印信息:
再点击NEXT进入下个页面,再点击DETAIL,得到打印信息:
可以发现,在第一个界面和第二个界面,使用的UserMode对象是同一个对象,在第三个界面所使用的是新对象,为什么? 来看代码吧!
在MainComponent和SecondComponent中,我们都是承载于UserModelComponent类,UserModelComponent类里面使用了@Singleton,所以导致MainComponent和SecondComponent都需要使用新的标签,而在ThreeComponent中,我们承载的是NewUserModelComponent,它是没有添加@Singleton,所以得到的不是原来那个单例。
细心的朋友可能发现了,打印信息里面的OkHttpClient和Retrofit也是同样的表现,我们可以看一下ModelModule类:
@Modulepublic class ModelModule { @Provides @Singleton OkHttpClient provideOkHttpClient() { OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60 * 1000, TimeUnit.MILLISECONDS) .readTimeout(60 * 1000, TimeUnit.MILLISECONDS) .build(); return client; } @Provides @Singleton Retrofit provideRetrofit(OkHttpClient client) { Retrofit retrofit = new Retrofit.Builder() .client(client) .baseUrl("http://www.baidu.com") // 这里替换为请求的基本url .build(); return retrofit; }}
mOkHttpClient和mRetrofit都被打上了@Singleton标签,那为什么他们两个都不是单例呢?这和@Scope标签的作用域有关,我在网上看到一段话,对这个标签的描述很详细:
Scope的使用,如何实现单例? 这个迷之Scope也是有点难以理解,我们在哪里使用到了Scope呢。在我们的AppComponent中添加了一个注解为@Singleton,@Singleton就是一个Scope,据说可以实现单例哟。。。难道这样就实现了单例模式?我刚刚开始是这样理解的。直到仔细的看了几遍这篇文章我才知道并不是这样的。 事实上@Sinleton中并没有创建单例的能力,那么AppComponent中提供的依赖注入是如何实现单例的呢。其实这个原理很贱单。 首先Module提供了创建实例的方法,接着AppComponent中对Module进行管理,最后AppComponent在自定义Applicaiton中被实例化了一次。 这个实例化了一次是最重要的呀。仅仅被实例化了一次,那不就是单例么。就是这么简单呀。 可能有些童靴当时就不乐意了,那既然这样都已经实现了单例,那么这个@Singltop还要来何用?不是多此一举吗。 其实@Singletop还有有一些作用的,首先一方面能让你直面的了解到这是一个单例,其次这个@Singletop能够更好的管理Modlue和Component之间的关系。 Dagger2需要保证Component和Module是匹配的,就需要用到这个注解。
项目的解析基本就到这里了。晒一下这个项目的整体照!
(以下是我个人观点,不对勿喷)
写代码写到后面,会发现“写代码”本就应该是一件艺术工作,如果去优雅的处理和电脑、手机、硬件之间的关系,是我们所追求的,我们应该使用最精炼的、最易懂的代码去解决工作难题,而不是违背大众的思维方式去独辟蹊径,就算最后你这样写了,在不容易理解的地方加上尽可能详尽的注释是非常有必要的。我之前就遇见过这种同事,总是以别人看不懂他的代码为傲,我实在不知道这有什么好的,别人看不懂,只能说明你这个方式有问题,大家是一个团队,不是一个人开发,代码可能需要大家相互去维护,所以,如果你这样做了,请以后善待代码,优雅的编程,优雅的工作!
源码下载
详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之一
详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之二
详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之三
- 详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之四
- 详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之一
- 详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之二
- 详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之三
- 一点一点的进步
- 一点一点的进步
- 【Android - 框架】之Dagger2+MVP的用法
- MVP项目研究——AppManager融合Dagger2和androidEventbus管理Activity的生命周期
- android之dagger2+rxjava+retrofit2+mvp架构的结合
- Dagger2和MVP的结合
- Dagger2+MVP
- Dagger2+mvp
- Android之dagger2的简单运用和详细解读(入门)
- 简单实用的mvp+retrofit+rxjava+dagger2
- 利用Dagger2构建的简易MVP框架
- 更清晰的Dagger2 + MVP 架构
- 最近很火的MVP+Retrofit2+rxjava+Dagger2框架 -- MVP
- MVP与MVP+Dagger2的使用及比较
- jsp内置对象session
- single-number-ii
- leetcode stack 155 225 232
- 瀑布流插件WookMark
- 理解(os等常用模块,列表解析,字典解析和集合解析)
- 详细的Dagger2+MVP融合,一行一行分析,一点一点进步,之四
- gulp serve 遇到的问题
- 【BZOJ 1922】【SDOI 2010】大陆争霸【Dijkstra】
- 数据结构之树
- 前端项目开发环境搭建
- 单链表的基本操作c语言实现
- 451. Sort Characters By Frequency
- HTML5基础——其他常用标记
- 【软件工程】机房文档--概要设计说明书