从实例出发理解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

    相关文章

      网友评论

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

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

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