前面我们分别将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类:
@Module
public 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融合,一行一行分析,一点一点进步,之一