详细的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融合,一行一行分析,一点一点进步,之三

0 0