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

本文介绍了Dagger 2 新版本提供的在android上简单的使用方法。

《赠幼骐伯约》

文能提笔安天下,武能上马定乾坤。

心存谋略何人胜,古今英雄唯是君!

-三国,诸葛亮

前言

看了很多介绍Dagger 2在 android 上使用的文章,大多都是使用的类似下面的这种方法:

public class FrombulationActivity extends Activity {

@Inject Frombulator frombulator;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

DaggerActivityComponent.builder()

.appComponent(YourApp.getAppComponent())

.activityModule(new ActivityModule(this))

.build()

.inject(this);

}

}

使用这种方法会有几个问题,一是这种模板代码会导致重构时很困难;二是打破了依赖注入的核心原则:类不应该知道它是如何被注入的。

Dagger 2在新版本提供了针对Android平台使用的超简单的方法。

添加依赖

首先添加dagger 2的依赖,目前最新版本是2.19:

dependencies {

implementation 'com.google.dagger:dagger:2.19'

annotationProcessor 'com.google.dagger:dagger-compiler:2.19'

}

这里我们需要使用到Android相关的功能,所以还需要下Android相关的依赖:

implementation 'com.google.dagger:dagger-android:2.19'

implementation 'com.google.dagger:dagger-android-support:2.19' //用于提供support类相关功能

annotationProcessor 'com.google.dagger:dagger-android-processor:2.19'

使用示例

这里我们采用MVP架构模式结合Dagger 2的使用进行说明,BasePresenter接口类如下:

public interface BasePresenter{

void takeView(T view);

void dropView();

}

HomeContract接口类如下:

public interface HomeContract {

interface View extends BaseView{

void logout();

}

interface Presenter extends BasePresenter {

void logout();

}

}

创建Presenter类实现相应接口,对Presenter构造方法添加@Inject注解,表示从这里可以获取Presenter的实例。这里Presenter暂时不需要参数,所以添加一个空的构造方法。

public class HomePresenter implements HomeContract.Presenter {

private HomeContract.View mView;

@Inject

public HomePresenter() {

}

...

@Override

public void logout() {

...

}

}

创建HomeModule抽象类并添加@Module注解,添加一个返回Presenter接口的抽象方法,参数为Presenter的实现类,其中@ActivityScope注解是我们自定义的注解,用于管理依赖生命周期,后面详细说明。注解@Binds表示将HomeContract.Presenter接口绑定到HomePresenter实现类:

@Module

public abstract class HomeModule {

@ActivityScope

@Binds

abstract HomeContract.Presenter bindPresenter(HomePresenter presenter);

}

然后创建一个用于生成Activity注入器的Module,使用@ContributesAndroidInjector注解并指定modules为HomeModule:

@Module

public abstract class ActivityBindingModule {

@ActivityScope

@ContributesAndroidInjector(modules = HomeModule.class)

abstract HomeActivity contributeHomeActivity();

...

}

使用@Component注解创建AppCompontent接口类,Dagger 2会生成带有Dagger前缀的Component类,如:AppComponent类会自动生成DaggerAppComponent类。继承自AndroidInjector并指定Application类,指定ActivityBindingModule类和Dagger 2提供的AndroidSupportInjectionModule类作为Module

@Component(modules = {ActivityBindingModule.class,AndroidSupportInjectionModule.class})

public interface AppComponent extends AndroidInjector {

}

修改Activity继承自DaggerActivity,如果你使用的是AppCompatActivity则继承自DaggerAppCompatActivity即可,然后对Presenter接口添加@Inject注解就可以了:

public class HomeActivity extends DaggerActivity implements HomeContract.View{

@Inject

HomeContract.Presenter mPresenter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mPresenter.takeView(this);

}

}

修改Application类继承自DaggerApplication,实现抽象方法applicationInjector,编译下工程,返回Dagger2自动生成的Component类的create方法,至此就完成了Dagger 2的引入。

public class App extends DaggerApplication {

@Override

protected AndroidInjector extends DaggerApplication> applicationInjector() {

return DaggerAppComponent.create();

}

}

总结

本文对MVP架构模式结合Dagger2的使用提供一个使用模板,后续会对Dagger2提供的注解详细讲解,敬请关注。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值