Dagger2在Android中的使用

【Android移动开发】Dagger2在Android中的使用

在我们写程序的过程中,不可避免的就会牵扯到一些依赖,如会创建各种工厂类来生产我们所要依赖的对象等等。太多依赖会让我们的程序看起来很乱,而且很不利于测试,所以我们就使用Dagger2来进行依赖注入。(文章转载自@MrlLee,安卓巴士)


依赖注入到底是个什么概念呢?我自己的理解就是将对象的生产和使用给分开了。比如说有一个Car对象,当你要出行的时候就自己new一个Car对象,然后使用这个Car对象出行。在这里你出行的时候Car就是你的依赖,没有这个Car就无法出行,所以就自己来创建这个Car。如果使用依赖注入了呢?创建和使用Car是分隔开的,创建的地方不考虑使用,使用的时候也不用考虑来创建,只要说我需要一辆Car,Dagger2就会自动帮你创建好并让你使用。这就在一定程度上解耦了程序,让你的模块更加地可以重用。


dagger2这样的依赖注入框架对MVP架构来说,是最好的解耦工具,可以进一步降低modle-view-presenter之间的耦合度。
所以,如果你的项目在使用MVP架构开发,强烈建议配合dagger2一起使用。



下面我们就在Android中试试Dagger2吧。但是首先还要弄清楚一些概念:


1、@Inject: 可以用在构造方法上,这样就告诉Dagger2使用这个构造方法来创建对象,如果构造方法里面有参数依赖的话会自动给填充上;也可以用在成员变量上,Dagger2会自动将这个变量初始化。用@Inject修饰的内容可以理解为产品


2、@Provides: 用来修饰方法来提供各种依赖,方法的返回类型就是所提供的依赖类型,用@Provides修饰的可以理解为生产机器


3、@Module:所有的@Provides方法都必须放到一个Moudle中,一个Moudle就是使用@Moudle修饰的类,可以理解为一个工厂


4、@Component:修饰一个接口,将依赖的生产和使用结合起来,可以理解为运输部门吧,将工厂生产的产品运送到使用它的人们手里。


光看文字可能还不是很明白,下面就来写代码实践吧。在这里我使用一个展示炉石传说卡片的app作为例子,我们使用Retrofit来访问网络接口,得到卡片的信息等。那我们会有哪些依赖呢?

  1. ApplicationContext对象,在Android app中使用十分广泛,比如我们需要获取资源文件等。

  2. 一个okHttpClient的对象,供Retrofit使用

  3. 一个使用Retrofit创建的网络访问的对象

  4. 可能会用到的Application对象


下面就一步步来吧,首先我们创建一个Moudle来提供对okHttpClient的依赖:




通过@Singleton注释可以确保这个OkHttpClient对象是一个单例模式,对于这个client对象,我们加入了HttpLoggingInterceptor来控制log的显示,便于调试。

下面来创建一个网络访问的Moudle,在这之前我们还要定义好网络访问的接口:





我们将使用Rxjava来处理网络返回的内容,并内置一个GsonConverterFactory来将请求的Gson信息自动转化成对象的Bean。需要注意的是getCardsApi的参数就是一个OkHttpClient对象,由于我们在前面提供了对OkHttpClient的依赖,所以这里使用的是会自动传进一个OkHttpClient对象。


下面来创建提供Conext和Application的Moudle:




这些Moudle提供了所有我们需要的依赖,下面使用一个Component接口来将这些Moudle结合起来




在这里接口里,我们定义了两个inject方法,我们将在MainApp和MainActivity里面使用Moudle里面提供的依赖。
在MainApp里面,我们创建一个AppComponent对象进行依赖的注入:




需要注意的一点就是里面DaggerAppComponent是由Dagger2自动生成的类,所以我们再写这些代码前要首先编译一下工程,让Dagger2生成这些类,否则是会报错的。


下面就在Activity里面使用吧,首先也是进行注入:




然后就可以直接进行网络的访问了:




在这里,我们访问网络所需要的mIApi对象将由Dagger2自动给我们生成,我们拿过来用就可以了。赶快来实验一下吧,通过log,我们可以看到我们正确地请求到了所要的数据:




实验成功,可以继续进行接下来的开发了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值