Android中Dagger2的使用

STM32异常与中断过程详解 1. 异常与中断概念引入 异常主要是指来自CPU内部的意外事件,比如执行了未定义指令、算术溢出、除零运算等发生在CPU内部的意外事件,这些异常的发生,会引起CPU运行相应的异常处理程序;中断一般来自硬件(如片上外设、外部I/O输入等)发生的事件,当这些硬件产生中断信号时,CPU会暂停当前运行的程序,转而去处理相关硬件的中断服务程序。但无论是异常还是中断,都会引起程序执行偏离正常的流程,转而去执行异常/中断的处理函数。 下面对异常和中断的介绍,如果中断信号的产生原因来自CPU内部,则称之为异常;如果中断信号来 阅读详情
Dagger2是一个在Java和android中使用的完全静态的编译时依赖注入框架。它改编了由Square创建的早期版本,现在由Google维护。
dagger2的优点

    首先说下dagger2的优点,为什么用dagger2(额,也可以说我看着大神用所以我也用吧,哈哈),掘金上的这篇文章是个很好的引入的例子,总结下来大概有三点:

1.增加开发效率、省去重复的简单体力劳动
    首先new一个实例的过程是一个重复的简单体力劳动,dagger2完全可以把new一个实例的工作做了,因此我们把主要精力集中在关键业务上、同时也能增加开发效率上。
省去写单例的方法,并且也不需要担心自己写的单例方法是否线程安全,自己写的单例是懒汉模式还是饿汉模式。因为dagger2都可以把这些工作做了。
2.更好的管理类实例
    每个app中的ApplicationComponent管理整个app的全局类实例,所有的全局类实例都统一交给ApplicationComponent管理,并且它们的生命周期与app的生命周期一样。Module中管理着所对应页面所依赖的所有类实例
3.解耦
假如不用dagger2的话,一个类的new代码是非常可能充斥在app的多个类中的,假如该类的构造函数发生变化,那这些涉及到的类都得进行修改。设计模式中提倡把容易变化的部分封装起来。
我们用了dagger2后,假如是通过用Inject注解标注的构造函数创建类实例,则即使构造函数变的天花乱坠,我们基本上都不需要修改任何代码。
假如是通过工厂模式Module创建类实例,Module其实就是把new类实例的代码封装起来,这样即使类的构造函数发生变化,只需要修改Module即可。

Module的构造函数也会发生变化,发生变化后,相应的new Module的类也发生变化,这就没有达到解耦的效果。首先解耦不是说让类之间或模块之间真的一点关系都没有了,解耦达到的目的是让一个类或一个模块对与自己有关联的类或模块的影响降到最低,不是说这种影响就完全没有了,这是不可能的。

解耦还有个好处,就是方便测试,若需要替换为网络测试类,只需要修改相应的Module即可。

下面说一下Dagger2中的注解
@Inject
作用:用来实例化对象
场景(两种):
class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater heater) {
    this.heater = heater;
  }
}
class CoffeeMaker {
  @Inject Heater heater;
  @Inject Pump pump;
}
public class MainFragment extends Fragment{
    @Inject
    MainPresenter mainPresenter;
    @Inject
    ToastUtil toastUtil;
    ...
}

就是说在需要依赖的地方使用这个注解(第一种场景:你用它告诉Dagger这个 构造方法,成员变量或者函数方法需要依赖注入。这样,Dagger就会构造一个这个类的实例(第二种场景:如何构造呢,就需要再类的构造方法上声明Inject注解,告诉Dagger,这个用来实例化对象)并满足他们的依赖。

@Module
@ContributesAndroidInjector
@Provides

@Binds

这四个一般情况是一起使用的,举个例子(这是例子链接)

@Module
public abstract class AddEditTaskModule {
    @Provides
    @ActivityScoped
    @Nullable
    static String provideTaskId(AddEditTaskActivity activity) {
        return activity.getIntent().getStringExtra(AddEditTaskFragment.ARGUMENT_EDIT_TASK_ID);
    }

    @Provides
    @ActivityScoped
    static boolean provideStatusDataMissing(AddEditTaskActivity activity) {
        return activity.isDataMissing();
    }

    @FragmentScoped
    @ContributesAndroidInjector
    abstract AddEditTaskFragment addEditTaskFragment();

    @ActivityScoped
    @Binds
    abstract AddEditTaskContract.Presenter taskPresenter(AddEditTaskPresenter presenter);
}

Module其实是一个简单工厂模式,Module里面的方法基本都是创建类实例的方法。所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候(如何构造呢?通过@Provides注解标识一个方法,根据方法的返回值来判断是构造哪个类的实例),就知道从哪里去找到需要的依赖。
那为什么有了Inject还需要Module呢?

  • Interfaces can’t be constructed.
  • Third-party classes can’t be annotated.
  • Configurable objects must be configured!
  • 此外,关于module中providers还有好玩的问题,可以看看例子

Binds注解用在这种情况:当参数和返回值类型相同时,将方法写成抽象方法,用Binds注解。

当Binds和Provides两种注解同时出现在同一个Module中时需要做下处理,有两种方案可以选择
1.最简单的方式就是将@Provides标示的方法设置成static的
2.如果不使用static的话,那么就将所有的@Binds修饰的抽象方法已到一个抽象的Module中

ContributesAndroidInjector呢?(这个注解可以先了解,因为它会涉及到后面讲解到的其他的注解)这个注解是2.11版本之后才有的,他的作用是“Generates an AndroidInjector for the return type of this method”,就是说ContributesAndroidInjector这个注解帮助我们生成了一个注射器,什么注射器呢,方法的返回值类型(例子中的AddEditTaskFragment)的注射器。也就是说通过将方法addEditTaskFragment标识@ContributesAndroidInjector注解会生成如下代码:

@Module(subcomponents = AddEditTaskModule_AddEditTaskFragment.AddEditTaskFragmentSubcomponent.class)
public abstract class AddEditTaskModule_AddEditTaskFragment {
  private AddEditTaskModule_AddEditTaskFragment() {}

  @Binds
  @IntoMap
  @FragmentKey(AddEditTaskFragment.class)
  abstract AndroidInjector.Factory<? extends Fragment> bindAndroidInjectorFactory(
      AddEditTaskFragmentSubcomponent.Builder builder);

  @Subcomponent
  @FragmentScoped
  public interface AddEditTaskFragmentSubcomponent extends AndroidInjector<AddEditTaskFragment> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<AddEditTaskFragment> {}
  }
}

可以看到ContributesAndroidInjector就是用来简化Subcomponent的书写,在2.11之前,每一个Fragment或者Activity都需要有自己的Component然后在Component中声明inject方法,最后在Fragment或者Activity中进行注入,而现在ContributesAndroidInjector一个注解完成了这些步骤,大大简化了dagger模板代码的书写。

不过需要注意的是ContributesAndroidInjector注解标识的方法必须是抽象方法并且返回值是具体的android framework的类型(比如Activity或者Fragment),此外,这个方法不能有参数。

额,如果你注意到了上面的代码中还有"ActivityScope"和"FragmentScope"这两个注解,别急,这属于Scope注解,后面会有讲解的。

@Component @Component.Builder @SubComponent @SubComponent.Builder
@Singleton
@Component(modules = {TasksRepositoryModule.class,
        ApplicationModule.class,
        ActivityBindingModule.class,
        AndroidSupportInjectionModule.class})
public interface AppComponent extends AndroidInjector<ToDoApplication> {

    @Component.Builder
    interface Builder {

        @BindsInstance
        AppComponent.Builder application(Application application);

        AppComponent build();
    }
}

Component也是一个注解类,一个类要想是Component,必须用Component注解来标注该类,并且该类是接口或抽象类。它在编译时会产生相应的类的实例来作为提供依赖方和需要依赖方之间的桥梁。
那我们看看这桥梁是怎么工作的:

Component需要引用到目标类的实例,Component会查找目标类中用Inject注解标注的属性,查找到相应的属性后会接着查找该属性对应的用Inject标注的构造函数(这时候就发生联系了),剩下的工作就是初始化该属性的实例并把实例进行赋值。因此我们也可以给Component叫另外一个名字注入器(Injector,事实上Component必须继承的父类就叫做AndroidInjector)

*以下知识点可以忽略,因为在2.11版本之后,ContributesAndroidInjector基本上代替了SubComponent的作用。

Component有两种组织方式(关于两种方式的对比可以看这儿和这儿,一种是SubComponent包含方式;另一种是dependencies依赖方式(这种方式只能获取到依赖的 Component 所暴露出来的对象)

Component.Builder注解只用在Component标识的接口或抽象类中,固定写法,用来提供Component实例。

SubComponent.Builder同理,只不过是用在SubComponent标准的类或者接口中。

这儿一般情况下还会用到一个注解BindInstance,这个注解用在Component.Builder或者Subcomponent.Builder标示的方法上,表示允许方法的参数可以绑定实例对象。

@Scope
Scope的真正用处就在于Component的组织。
更好的管理Component之间的组织方式,不管是依赖方式还是包含方式,都有必要用自定义的Scope注解标注这些Component,这些注解最好不要一样,不一样是为了能更好的体现出Component之间的组织方式。

  • 正常情况下没有任何Scope标示的Component,注入器每次根据依赖都会新的实例,而如果有Scope标示,那么注入器创建实例后会进行保存,以便在稍后的注射中可能重用。
  • 没有使用Scope标示的Component不能依赖一个使用Scope标示的Component,而且依赖Component的SubComponent必须使用和父Component不同的Scope标示
  • 更好的管理Component与Module之间的匹配关系,编译器会检查 Component管理的Modules,若发现标注Component的自定义Scope注解与Modules中的标注创建类实例方法的注解不一样,就会报错。
  • 可读性提高,如用Singleton标注全局类,这样让程序猿立马就能明白这类是全局单例类。

例如你可以这样定义一个Scope

@Documented
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScoped {
}

而@SingleTon这是个特殊的Scope,它的注释是这样的

Identifies a type that the injector only instantiates once. Not inherited

意思就是说标识注入器只会初始化一次这种类型。但是他是怎么做到的呢?可以参考这篇文章
@Qualifier

创建类实例有2个维度可以创建:

  • 通过用Inject注解标注的构造函数来创建(以下简称Inject维度)
  • 通过Module中的Providez注解或者Binds等注解来创建(以下简称Module维度)

这2个维度是有优先级之分的,Component会首先从Module维度中查找类实例,若找到就用Module维度创建类实例,并停止查找Inject维度。否则才是从Inject维度查找类实例。所以创建类实例级别Module维度要高于Inject维度。
现在有个问题,基于同一个维度条件下,若一个类的实例有多种方法可以创建出来,那注入器(Component)应该选择哪种方法来创建该类的实例呢?Qualifier注解用来区分同一纬度下两种不同的创建实例的方法

有三个步骤:

1.定义两个不同的Qualifier,标识

@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Local {

}
@Qualifier
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Remote {

}
2.在同一个Module中定义两个返回值相同的方法
    @Singleton
    @Binds
    @Local
    abstract TasksDataSource provideTasksLocalDataSource(TasksLocalDataSource dataSource);

    @Singleton
    @Binds
    @Remote
    abstract TasksDataSource provideTasksRemoteDataSource(FakeTasksRemoteDataSource dataSource);

3.具体使用,用@Remote标识的对象会通过provideTasksRemoteDataSource方法来实例化,用@Local标识的对象会通过provideTasksLocalDataSource方法来实例化

@Inject
    TasksRepository(@Remote TasksDataSource tasksRemoteDataSource,
            @Local TasksDataSource tasksLocalDataSource) {
        mTasksRemoteDataSource = tasksRemoteDataSource;
        mTasksLocalDataSource = tasksLocalDataSource;
    }

当然,在javax.inject包中,定义好了一个可以直接使用的Qualifier,“Named”

@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Named {

    /** The name. */
    String value() default "";
}

你可以不用自定义Qualifier而是直接使用Named注解他的使用方法和自定义的类似,举个例子:

@Singleton
@Binds
@Named("Local")
abstract TasksDataSource provideTasksLocalDataSource(TasksLocalDataSource dataSource);

@Singleton
@Binds
@Named("Remote")
abstract TasksDataSource provideTasksRemoteDataSource(FakeTasksRemoteDataSource dataSource);
当理解了上面的注解之后,那么我们来创建一个Android App。

额,首先创建例子中的di文件夹以及里面的5个类,这个一般情况下是固定的,然后在Application中继承HasActivityInjector和HasSupportFragmentInjector并进行方法实现(具体看例子就好了),最后再BaseActivity和BaseFragment中做处理。BaseActivity需要继承HasSupportFragmentInjector接口然后 实现方法(和Application类似,因为一般情况下Activity会包含Fragment),然后加上注入代码

 AndroidSupportInjection.inject(this);

注意:BaseActivity的注入代码是加在onCreate()方法中,而Fragment的注入代码是加在onAttach方法中,参考自这儿

例子地址在:https://github.com/fanturbo/TodoApp

参考:
古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法    最近想在Gazebo中开发一些仿真内容,于是购买了古月学院的《如何在Gazebo中实现阿克曼转向车的仿真》课程,但是由于ROS 版本的更新,拿到手的课程资料不能直接在ROS Noetic版本中运行,经过我这几天的探索,对遇到的错误及解决方法进行了整理,方便后面购买课程的小伙伴更快的成功运行程序    在文章正式开始之前,先放一下我之前为了寻找该资料报错的原因,而写的两篇与该课程相关的文章链接,感兴趣的可以自行阅读    以阿克曼转向车为例对URDF和XACRO文件进行解读(点击可跳转)    将x 阅读详情

相关推荐

用ESP32-S3+OV2640摄像头+ILI9488屏,DIY一个能联网的智能猫眼(附完整代码)

本文详细介绍了如何利用ESP32-S3微控制器搭配OV2640摄像头和ILI9488显示屏,DIY一个功能强大的智能猫眼系统。从硬件选型、电路设计到软件开发,提供了完整的解决方案和优化技巧,包括图像采集显示、WiFi远程访问及低功耗设计,适合智能家居爱好者动手实践。

weixin_30897233的博客 501

Android主流三方库源码分析:Dagger2,配电系统工程师面试问题

AbstractAllFragmentModule.class, AbstractAllDialogFragmentModule.class} ) public interface AppComponent { /** 注入WanAndroidApp实例 @param wanAndroidApp WanAndroidApp */ void inject(WanAndroidApp wanAndroidApp); … } 复制代码 可以看到,AppComponent依赖了AndroidInjec

m0_64604178的博客 498

别光看Demo了!用UE5 Lyra框架快速搭建你的多人对战游戏原型(含完整配置流程)

本文详细介绍了如何利用UE5 Lyra框架快速搭建多人对战游戏原型,包含完整的配置流程和实战案例。Lyra作为可直接二次开发的游戏模板,内置了GAS技能系统、Enhanced Input输入控制等核心功能,大幅缩短开发周期。通过替换角色模型、调整武器数值和配置新地图规则,开发者可在48小时内完成科幻团队竞技游戏原型的搭建。

weixin_28717411的博客 457

java inject Android,java – Dagger 2.11:使用@ContributesAndroidInjector时的Local Singleton

Component Application/ \Subcomponent DrawerActivity Subcomponent SubActivity|Subcomponent DrawerFragment在SubActivity和DrawerActivity中,我使用标记为@Singleton的相同存储库实例.@Singleton@Component...

weixin_33037313的博客 276

HRNet 【demo 复现过程】

Deep High-Resolution Representation Learning for Human Pose Estimation

qq_45257495的博客 5556

告别License烦恼:手把手教你用VS Code+Cppcheck搭建免费的MISRA-C代码检查环境

本文详细介绍了如何使用VS Code和开源工具Cppcheck搭建免费的MISRA-C代码检查环境,帮助开发者规避商业工具的高额License费用。通过四步环境搭建和实战技巧,实现高效的代码静态检查,提升嵌入式开发的安全性和可靠性。

weixin_42523326的博客 248

dagger android 学习(三):ContributesAndroidInjector的进一步优化

本系列博客主要用于自己学习积累,顺便帮助新手入门,如有问题,多多包涵。更详细的一些使用可以看看其他更加详细的博客。 dagger android 学习(一):dagger基础使用 dagger android 学习(二):AndroidInjector的使用 dagger android 学习(三):ContributesAndroidInjector的进一步优化 dagger android 学...

weixin_34329187的博客 2954

告别手动抓信号!Synopsys AXI VIP的Port Monitor实战:5分钟搞定与Scoreboard的TLM连接

本文详细介绍了Synopsys AXI VIP的Port Monitor功能,帮助验证工程师快速实现与Scoreboard的TLM连接,5分钟内完成自动数据收集。通过实战指南和常见问题排查,提升验证效率,告别手动抓信号的繁琐流程。

weixin_30565327的博客 300

Dagger2与AndroidInjector

使用过Dagger开发Android应用的小伙伴会知道我们会在Activity或Fragment的生命周期方法中执行成员注入。比如这样:

唯鹿的博客 1万+

鸿蒙5应用真机调试超详细教程

本文详细介绍了鸿蒙5应用的真机调试全流程,包括开发环境搭建(安装DevEcoStudio、配置SDK)、真机调试准备(开启USB调试、配置自动/手动签名)、调试实战(生成HAP包、断点调试技巧)以及多设备协同调试方法。文中提供了设备连接、签名配置等常见问题的解决方案,并包含示例代码展示分布式设备联动功能。通过本教程,开发者可快速掌握鸿蒙5应用的调试技能,建议结合官方文档深入学习高级调试技巧。

2301_79392153的博客 2196

南方电网专业面试题(电气类-继电保护)(目录)

南方电网专业面试题(电气类-继电保护)(目录) 这些面试题围绕继电保护的基本概念、工作原理、分类、性能要求,以及变压器、断路器、母线保护、自动重合闸等电力系统关键设备的保护机制和操作原则展开,旨在评估应聘者对电力系统保护和控制策略的深入理解和实际应用能力。

weixin_44808274的博客 2159

Android 之dragger使用

1、依赖的注入和配置独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用大改代码库。 2、依赖可以注入到一个组件中:我们可以注入这些依赖的模拟实现,这样使得测试更加简单。 3、app中的组件不需要知道有关实例创建和生命周期的任何事情,这些由我们的依赖注入框架管理的。 我觉得,dagger...

weixin_34247155的博客 393

手撕Lua字节码:从黑盒到透明

lua 字节码 怎么‘手撕’一个 chunk 看看里面啥样?我手里有一个.luac或出来的二进制字节码,想知道里面到底是什么结构、哪些字段、有哪些指令,怎么一步一步“拆箱”,从一个黑盒变成有迹可循的东西?也就是:不满足于只会loadpcall而是想亲眼看看一个 chunk 内部长啥样,甚至写点工具把它解析出来。这篇就用带你从“拿到一坨.luac不搞高深玄学,尽量让你看完就能自己动手。注:以 Lua 5.3/5.4 为主,细节各版本略有不同,但大体套路是一致的。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 99

dagger android,Dagger2 系列(三)Dagger2.Android使用详解

前言前两篇文章我们介绍了dagger2的使用和基本原理,为了适用于android项目代码特点,更简洁的实现四大组件和Fragment的注入,dagger2团队为我们又进一步的封装,也就是我们要介绍的dagger2.android。对dagger2原理和使用不了解的朋友先移步看前两篇文章。dagger2.android 产生的意义上篇文章讲到了component的继承和依赖实现方式,在实际andro...

weixin_30104235的博客 447

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

dagger2之dagger-android简单使用

dagger2的使用便利我就不用说了,google为方便android开发者进而推出了dagger-android,这里附录官方文档:[https://google.github.io/dagger/android.html] 需要增加依赖: compile 'com.google.dagger:dagger:' + dagger_version compile "com.google

罗春娥的技术园 2117

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Dagger2-android (不是dagger2)使用

dagger2-android

qq8803128的博客 524

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Dagger 2应用于Android的完美扩展库-dagger.android

Dagger 2应用于Android的完美扩展库 - dagger.android

行云间 1万+

Dagger.Android — Dagger2进阶

一,前期基础知识储备 参考笔者之前的文章《依赖注入框架-Dagger2 精炼详解》,里面有Dagger2的常规用法——@Inject,@Component,@Module,@Provides这些基本注解。 这里沿用上篇文章中示例,在Activity中完成一个类的注入,代码如下: public class HttpActivity extends AppCompatActivity { ...

Chin_Style的博客 531

dagger android,在Android开发中使用Dagger2的方法

在Android开发中使用Dagger2的方法发布时间:2020-12-08 17:12:38来源:亿速云阅读:236作者:Leah在Android开发中使用Dagger2的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用方法如下:@Component(modules = MyAppModule.class)public abs...

weixin_39926104的博客 149

Android框架—Dagger2使用

一、概述 现在android开发越来越多的应用到各种框架,一个好的app架构不但可以支持好的性能,同时也可以更方便快捷的开发功能。依赖注入是java后端开发spring的核心技术,而对于android来说现在由谷歌爸爸亲管的dagger则是不二之选。 二、dagger环境配置 使用Android Studio 创建一个新的项目,在Project的 build.gradle文件添加以下内容...

qq_24442769的博客 4897

android dagger2 原理,android – Dagger2没有生成Dagger *类

正如标题所说,Dagger2没有为我的Android项目生成Dagger *前缀类.我查看了我能找到的所有其他类似帖子,但没有任何帮助.我正在尝试将它添加到现有项目中,并且我遇到了一些初始问题,使其能够很好地处理数据绑定,但我似乎已经对其进行了排序,即数据绑定没有编译错误,并且它为它生成代码.我还下载了几个工作正常的示例项目.我的顶级graddle文件有classpath 'com.neenbed...

weixin_29200741的博客 286

Android Dagger2使用详解

官网地址:https://dagger.dev/ Github地址:https://github.com/google/dagger

hongxue8888的博客 2010

dagger2-android,Dagger 2 在 Android 上的使用(一)

本文介绍了Dagger 2 新版本提供的在android上简单的使用方法。《赠幼骐伯约》文能提笔安天下,武能上马定乾坤。心存谋略何人胜,古今英雄唯是君!-三国,诸葛亮前言看了很多介绍Dagger 2在 android 上使用的文章,大多都是使用的类似下面的这种方法:public class FrombulationActivity extends Activity {@Inject Frombul...

weixin_28835551的博客 375

android dagger2 讲解,dagger 2 详解

前言依赖注入概念网络有很多解释,这里就不详细介绍,本文通过一个简单的示例一步步深入了解依赖注入的优势以及为什么使用依赖注入。概念依赖注入(Dependency Injection),简称DI,又叫控制反转(Inversion of Control),简称IOC。当一个类的实例需要另另一个类的实例进行协助时,在传统的设计中,通常由调用者来创建被调用者的实例,然而依赖注入的方式,创建被调用者不再由调用...

weixin_36399948的博客 687

Dagger2:基于android的Spring?

Dagger2 基于android的Spring前几天刚好项目不忙, 去看看Dagger2的学习资料,为什么到现在才看它呢? 也许是它不容易上手一个原因吧, 但更多的是我个人的执念,我就觉得基于注解和反射的东西都不是什么好东西? 呵呵 , 但最近看到它是越来越多的被集成于的项目中去,并且经常和rxjava绑在一起使用,感觉也是非常的牛逼。大家都说好,那我也虚心学习下咯。学了几个小时次,总结

Marshon的专栏 1961

【Android】Dagger2 + MVVM

背景 一个标准的Android的MVVM架构是分层规划实现的,各层之间有清晰的依赖关系。借助Dagger2完成MVVM各层所需的依赖注入,可以让项目结构变得更清爽和更可维护。 虽然Dagger2有一定使用门槛,但是MVVM的项目结构大都相同,实现一个Dagger2+Retrofit2(+OkHttp3)+ViewModel 的最小构成实践,对其他类似项目具有一定参考意义。 构成 1. g...

移动端开发干货分享 2294
上一篇: 我的成长之路
下一篇: Dagger2关于Scope的理解
ITurbo
博客等级 码龄15年 17粉丝 70原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值