美文网首页Android心得总结安卓组件化开发Android
从零开始Android组件化改造(五) - Dagger2的使用

从零开始Android组件化改造(五) - Dagger2的使用

作者: BzCoder | 来源:发表于2019-07-17 11:06 被阅读0次

    我的Github:https://github.com/BzCoder
    本文基于MVPArms进行分析:https://github.com/JessYanCoding/MVPArms
    欢迎各位留言讨论

    Dagger2算是本框架中学习成本最高的一个框架,很多细节也确实很难在本文章中一言尽之,本文中也就整理本人在组件化开发中对于Dagger2的理解与使用。

    Dagger2

    Dagger2是一个依赖注入框架,什么是依赖注入?简单通俗的说,将类的初始化通过注入的方式去实现从而降低类与类之间的耦合度。

    常用注释以及含义:

    注解 含义
    @Inject 注入
    @Binds 指定接口的实现
    @Provides 提供实例
    @Named 类型一致时,需要用Named来指定Inject与Provides 的关系
    @Singleton 单例
    @Component.Builder Component的构造方法,详细规则见Dagger2源代码注释
    @BindsInstance 为变量先提前打桩

    组件化项目中使用Dagger2

    在组件化工程中虽然分为多个模块,但是组件之中还是存在诸多共用组件(网络,缓存,图片加载,生命周期管理,错误管理等),我们保持这些组件的单例,但是同时我们也要保证模块的低耦合性。此时我们就需要灵活使用Dagger2来解决这些问题。

    实现方案

    设定一个父类AppComponent。然后我们工程中所有Component都要通过dependencies依赖此Component以便所有组件可以使用全局共用组件。一般在业务页面(Fragment,Activity)中可以这样按以下使用。

    @xxxxxScope
    @Component(modules = xxxxFragmentModule.class, dependencies = AppComponent.class)
    public interface xxxxxFragmentComponent {
        void inject(xxxxFragment fragment);
        @Component.Builder
        interface Builder {
            @BindsInstance
            xxxxtComponent.Builder view(NewsListContract.View view);
            xxxxComponent.Builder appComponent(AppComponent appComponent);
            xxxxComponent build();
        }
    }
    

    其中AppComponent关联了三个Module,分别对应了三大块工具。

    1.AppModule

    AppModule是App基础实例,包含了每个模块都需要的实例以及Application,Activity,Fragment的管理, 其中还包含了我们之前在从零开始Android组件化改造(四) - 模块配置的统一管理中提到的ActivityLifecycle。除此之外还包含:

    • Gson
    • Cache
    • ActivityLifecycleCallbacks
    • FragmentLifecycleCallbacks
    • RepositoryManager

    2.ClientModule

    ClientModule是第三方框架实例,但是与AppModule不同的是,ClientModule的@Provides方法还包含了第三方的框架配置参数信息,这些参数方便在各个模块中对第三方框架进行个性化配置,而这些信息是通过GlobalConfigModule传入的,当然可以根据实际情况增减,现在第三方主要包含了以下:

    • OkHttpClient
    • Retrofit
    • RxCache
    • RxErrorHandler
    • Interceptor
      配置写法如下,其中RxCacheConfiguration中在下面的GlobalConfigModule中取得。
        @Singleton
        @Provides
        static RxCache provideRxCache(Application application, @Nullable RxCacheConfiguration configuration
                , @Named("RxCacheDirectory") File cacheDirectory, Gson gson) {
            RxCache.Builder builder = new RxCache.Builder();
            RxCache rxCache = null;
            if (configuration != null) {
                rxCache = configuration.configRxCache(application, builder);
            }
            if (rxCache != null) return rxCache;
            return builder
                    .persistence(cacheDirectory, new GsonSpeaker(gson));
        }
    

    3.GlobalConfigModule

    GlobalConfigModule是用来注入配置的Module,利用建造者模式+Dagger2构建的一个类,通过从零开始Android组件化改造(四) - 模块配置的统一管理中收集的ConfigModule将配置收集至此,集中到Dagger2中管理,最终配置到ClientModule中的第三方框架中。详情可以在GlobalConfigModule.java查阅。通过
    Mainifest->ConfigModule->GloablConfigModule->ClientModule的路径,最终完成各个模块对于总体工程的配置。

    至此我们就介绍完了Dagger2在组件化开发中使用,其中利用Dagger2完成对于不同模块对于APP总体配置的实现思路是非常巧妙的。既保证了单一性也保证了灵活性。

    相关文章

      网友评论

        本文标题:从零开始Android组件化改造(五) - Dagger2的使用

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