前言
网上都说Dagger2是比较难上手的,我在看了大量资料和使用时也遇到了很多不懂或者模糊的知识点,而且大部分博客资料都比较古老。突然有那么一瞬间,突然明白了所以然,故总结了4篇文章。话说在java中使用还是很繁琐的,不要怕带你真正上手,并运用到我们的Android项目中去。
本次Dagger2讲解总共分4篇:
1、Dagger2基础知识及在Java中使用(1)
2、Dagger2基础知识及在Java中使用(2)
3、Dagger2进阶知识及在Android中使用
4、Dagger2华丽使用在MVP框架中
通过上一篇Dagger2在Android中的使用,我相信代码已经够简洁。而且使用比较灵活了。这篇我们将介绍,怎么在MVP项目里用。会将之前Presenter以依赖注解的方式到Activity里。而且会举个小栗子。请注意这里我会以我之前讲的那篇MVP Demo的角度讲解。不了解的可以通过以下链接去看。绝对受益匪浅!
特别提醒:我这里是以我之前的那篇MVP讲解,刚好那篇只涉及到了RxJava + Retrofit + MVP。这次我们加上Dagger2;
没有了解的先去看这篇文章 RxJava + Retrofit + MVP(看完还不明白,吐槽我。适合初学者,VIP版MVP框架!!)
我会以之前那篇MVP的角度去讲。
首先添加上Dagger2依赖
//引入dagger.android库
implementation 'com.google.dagger:dagger-android:2.24'
// if you use the support libraries
implementation 'com.google.dagger:dagger-android-support:2.24'
annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
然后在MVP项目里新建daggerforandroid包,加上我们的AppComponent 以及注册的Module: NeedInjectModules。这里我们只把POSTFragment改成使用Dagger2的Fragment
NeedInjectModules如下,我这里不再叙述这些标注的作用。上一篇都说的很清楚了
@Module
public abstract class NeedInjectModules {
@ContributesAndroidInjector
abstract POSTFragment injectPOSTFragment();
}
AppComponent如下,
@Component(modules = {
AndroidSupportInjectionModule.class,
NeedInjectModules.class,
})
public interface AppComponent extends AndroidInjector<MyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
写到这里,我们需要初始化的数据是Presenter。,因为我是无参,所以直接用@Inject。如果你需要带参数,请注意使用Module。做完这部后,请记得Make Project.
public class PostPresenter extends BasePresenter<PostContract.View> implements PostContract.Prensenter {
@Inject
public PostPresenter(){
}
...//省略部分代码,便于理解
}
修改我们的Application如下,继承DaggerApplication,把DaggerAppComponent.Builder返回出去
public class MyApplication extends DaggerApplication {
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.builder().application(this).build();
}
}
重点来了
之前我们使用RxJava + Retrofit + MVP的Demo,为了解决RxJava的内存泄漏, 使用了RxActivity,和RxFragment。
通过上一篇Dagger2在Android中使用,是需要继承DaggerActivity 和 DaggerFragment的。。
这个时候怎么办呢。我们来看我们点开DaggerActivity的源码;
看完是不是有感觉了,我们新建一个BaseDaggerActivity 代码和之前的BaseActivity一模一样。唯一不同的是实现implements HasAndroidInjector 接口,并按源码里的去配置参数。
同时注意要给mPresenter加上@Inject标注,然后把我们之前页面new的方法cretaePresenter删除。搞定了
public abstract class BaseDaggerActivity<T extends BasePresenter> extends RxFragmentActivity implements BaseView, HasAndroidInjector {
@Inject
public T mPresenter;
//public abstract T cretaePresenter();
...//省略部分代码,便于理解
}
做完以上就搞定了,BaseDaggerFragment也是一样,如果需要注解的只要继承BaseDaggerActivity,不需要注解的话只要继承BaseActivity,即可。
以上就是用Dagger2 依赖注入Presenter。
这里有个小例子,让你对Dagger2爱不释手
以上操作清楚后,我在Demo里的POSTFragment,用了依赖注入,代码如下:
public class POSTFragment extends BaseDaggerFragment<PostPresenter> implements PostContract.View {
@Inject
Woman woman;
@OnClick(R.id.btn_dagger)
public void daggerClick() {
ToastUtils.showToast(woman.getSoul().getMoney() + "");
}
}
toast结果是 :100;
我们看看Woman的代码,注入了Soul
public class Woman {
@Inject
Soul soul;
@Inject
public Woman() {
}
public Soul getSoul() {
return soul;
}
public void setSoul(Soul soul) {
this.soul = soul;
}
}
我们看看Soul的代码,当然你可以用Module传值。
public class Soul {
private int money = 100;
@Inject
public Soul() {
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
这样写完Woman类,和Soul类。不用做别的操作,就能用了。当然如果用Module传值,要在AppComponent写上!!是不是很方便很方便。
结束语:至此,我们4篇文章全部结束了。看完,是不是觉得Dagger2在Android中很好用。省去了所有new的过程,如果你再100个页面都使用了new 某个类。但是突然高需求,改了构造方法什么的,或者其他一些方法,是不是只要在Module里修改下就行了? 完美解耦
本文github Demo地址
花了老大劲,别误会,不是要钱。能不能留下个足迹star啊