从实例出发理解Dagger2(一)

作者: From64KB | 来源:发表于2017-11-09 20:24 被阅读1109次

看了很多Dagger2的文章,感觉道理好像明白了,但是真的到用的时候仍然有点萌萌的,哦,不,懵懵的。完全不知道从哪里下手,真系样银感到绝望啊。由此打算写一个从实例出发,从没有Dagger2的代码到一点一点带入Dagger2,希望这样可以帮助理解Dagger2。

在看这篇文章之前,希望大家对Dagger2有一个基本的了解。这样看起来更有助于理解记忆。

Dagger2 is really just an annotation processor,it's just a code generator.
Dagger2只是一个注解处理器,用于帮助生成代码。 所以先抛开之前看到的依赖注入的相关概念,认识Dagger2的本质。

看完了上面这句话,就让我们把例子举起来吧。

通常我们在构建App的时候会用到很多的库,包括网络(Retrofit/OKHttp)、图片请求(Picasso)、数据解析(Gson)等,通常我们会在Application中初始化这些库。而且这些库之间本身就会有相互的依赖,比如Retrofit依赖OKHttp,Picasso也可以使用OKHttp传输图片数据,OKHttp依赖HttpLoggingInterceptor拦截网络请求,日志的打印依赖Timber等。这样一路下来有不少初始化的代码要去写。如图所示:


Application初始化.png

这还只是一些基础库的初始化代码,如果项目稍微复杂点,Application里初始化代码多到让人头晕,甚至影响分析Application里的逻辑。

现在我们需要写一个展示GitHub用户Feed流信息的页面,长这样吧:


image.png

这里面需要用到ListView展示这些信息。这里面每一个Item叫RepoListItemRepoListItem中需要使用Picasso加载图片,那么可以这么写代码:

image.png

注意啦,这里就会有对Picasso的依赖了(Picasso.with(getContext()))。 这样是不利于我们后续的测试工作的,最好这个Picasso是由构造器传入的。那么就在构造这个类的时候传入一个Picasso对象。在构造这个类的时候需要一个Picasso 类,这就导致了对Picasso的依赖,而提供这种依赖的方法就是依赖注入。通过构造器传入对象也是一种注入依赖的方法,由此可见依赖注入并没有想象的那么神秘。代码如下:

image.png
那么我们在ListView的Adapter中构造这个Item 的时候就需要传入一个Picasso对象。这样不可避免的也就要在构造这个Adapter的时候传入一个Picasso对象。
image.png

这样在Activity中构造Adapter的时候就需要传入Picasso对象,由于Picasso在Application中已经创建好,所以直接从Application中获取就好。通过网络获取数据后就能在界面上展示了:


image.png

好了让我们来分析一下现在形成的依赖关系把。


image.png

这仅仅是一个简单的页面展示,就会涉及到这么多依赖的类,想想复杂得多的页面逻辑,new了50多个的对象,看着堆积成山的代码不禁有点无奈 。这时候就要用到Dagger2解决的问题,Dagger2能够把我们从枯燥的初始化类的工作中解放出来 ,专注业务逻辑,同时保持代码的整洁。 Dagger能够生成这些代码,只需要我们告诉他如何创建一个类,如何找到各个类之间的依赖关系(例如OKHttp和Retrofit之间的关系)。

其实上面的介绍就是想粗略的表述一下依赖注入的概念和使用Dagger的必要性。下一篇文章会讲解如何在Application中使用Dagger2逐个改变各个类库的初始化代码。

相关文章:
从实例出发理解Dagger2(一)
从实例出发理解Dagger2(二)
从实例出发理解Dagger2(三)
从实例出发理解Dagger2(四)
从实例出发理解Dagger2(五)
从实例出发理解Dagger2(六)
从实例出发理解Dagger2(七)

参考资料:https://www.youtube.com/watch?v=Qwk7ESmaCq0

相关文章

  • 从实例出发理解Dagger2(一)

    看了很多Dagger2的文章,感觉道理好像明白了,但是真的到用的时候仍然有点萌萌的,哦,不,懵懵的。完全不知道从哪...

  • 从实例出发理解Dagger2(二)

    You need to tell the Dagger2 how to create your dependenc...

  • 从实例出发理解Dagger2(四)

    在说Scope之前,让我们先在代码里面搞一些事情,这样发现问题后更加有助于理解Scpoe的概念。 事情是这样的: ...

  • 从实例出发理解Dagger2(三)

    很显然,Context并不能通过new的方式提供,那么就通过构造函数传参的方式提供。详细代码如下: 那么通过这种注...

  • 从实例出发理解Dagger2(七)

    接着上篇文章讲,如果在HomeActivityComponent中添加获取Picasso和GitHubServic...

  • 从实例出发理解Dagger2(六)

    到目前为止我们使用Dagger创建的对象都Application级别,即和整个应用的生命周期相同的。那还有很多情况...

  • 从实例出发理解Dagger2(五)

    上一片文章最后提到的容易让人误解的@Singleton希望大家要记住。 等等,说起来好像上上上篇文章里还有一个抬杠...

  • 安卓dagger2简易使用教程

    1.什么是dagger2 dagger2是一个依赖注入框架,依赖注入,我的理解是,一个类中所依赖实例变量,不在本类...

  • Dagger

    神兵利器Dagger2 Android:Dagger2系列2 实例解析(更新完毕) Dagger2 最清晰的使用教程

  • dagger2使用入门

    1.什么是dagger2 简单来说,dagger2是一个依赖注入框架,代替你生成实例,管理各种实例的依赖关系的库。...

网友评论

  • 小刘哥可爱多:这样做 Picasso持有全局的context,页面销毁的时候,context并不会销毁,内存泄漏了吧
    From64KB:@小刘哥可爱多 嗯,确实有这样的问题,多谢指正。这里仅仅作为一个Dagger2,千万不要误导大家:clap:
  • scarerow:感谢楼主分享,看完后受益匪浅,这是我看到最完整详细的dagger2资料
  • 流穿枫:看完了,感谢楼主的讲解
    From64KB:@流穿枫 不客气,也很感谢你能看完。

本文标题:从实例出发理解Dagger2(一)

本文链接:https://www.haomeiwen.com/subject/qcfrmxtx.html