前面的一记录了一下常用的Annotation接下来开始研究究竟怎么使用Dagger2!!
准备工作
- 首先在app的build.gradle文件中做如下配置:
dependencies {
apt 'com.google.dagger:dagger-compiler:2.5'
compile 'com.google.dagger:dagger:2.5'
}
- 然后在Project的build.gradle文件中做如下配置
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
上面我们添加了编译和运行库还有apt插件,studio一定不要忘了apt插件,还有就是写完了以后如果有一天打开项目发现Dagger的部分报红,不要慌,build一下就好了
- 建议大家这么分包
- components就是注射器的意思,作用就是注入
- module 顾名思义,模块的意思,这个包下面的就是我们所有想要提供给注射器的对象
- scope 这个包下面规定了一些自定义注解,如上一篇写的@PerActivity @PerFragment 限定注解的作用域为当前Activity的Runtime
接下来到重点了......
首先从scope包开始
@Scope@Retention(RUNTIME) public @interface PerFragment {}
@Scope @Retention(RUNTIME) public @interface PerActivity {}
这是两个自定义注解类,大家都这么写的我就照搬过来了,解释一下,首先@Scope是Dagger2的注解,上面讲过,就不写了,@Retention是java的注解,后面的值给的是RUNTIME,意思就是下面这个注解的作用域是运行时的,假如当前的Activity或者Fragment被销毁了,这个注解就失效了,就会回收注入的对象.(这些只是我自己个人的见解,可能不太正确,有问题的望及时纠正!!!)
然后是module包
@Module
public class AppModule {
private final Context context;
public AppModule(Context context) {
this.context = context; }
@Singleton
@Provides
public Context ProvideContext() {
return context;}
}
这个是全局的app的实例仓库,这里我们只是提供出去了一个单例的context,你可以在这里往app注入任何你想注入的对象,比如Gson客户端等所有你想注入的!
@Module
public class ActivityModule {
private final Activity mActivity;
public ActivityModule(Activity mActivity) {
this.mActivity = mActivity; }
@Provides
@PerActivity
public Activity provideActivity() {
return mActivity; }
}
这个是ActivityModule的写法,下面的@PerActivity前面也有讲过,就不赘述了,因为假如不用MVP模式进行编写的话这个类里面我们不会过多的些什么,所以等我学了MVP再来补充吧,这里先放下.
@Module
public class FragmentModule {
private final Fragment mFragment;
private final Activity activity;
public FragmentModule(Fragment fragment, Activity activity) {
this.mFragment = fragment;
this.activity=activity; }
@Provides
@PerFragment
public Fragment provideFragment() {
return mFragment; }
@Provides
@PerFragment
public Activity provideActivity() {
return activity; }
}
FragmentModule:这里我们在运行时往所有注册了的Fragment中注入了一个当前他所依附的Activity的对象,以及当前Fragment的对象,其他的暂时也没有多写.
今天就先写到这里吧,理解理解觉得有点儿懵逼,等我捋一捋清楚了再说吧