Dagger 2 在 Android(安卓)上的使用(一)
本文介绍了Dagger 2 新版本提供的在android上简单的使用方法。
本文首发:http://yuweiguocn.github.io/
《赠幼骐伯约》
文能提笔安天下,武能上马定乾坤。
心存谋略何人胜,古今英雄唯是君!
-三国,诸葛亮
前言
Dagger 2 在 Android 上的使用(一)
Dagger 2 在 Android 上的使用(二)
Dagger 2 在 Android 上的使用(三)
Dagger 2 在 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实现类:
@Modulepublic abstract class HomeModule { @ActivityScope @Binds abstract HomeContract.Presenter bindPresenter(HomePresenter presenter);}
然后创建一个用于生成Activity注入器的Module,使用@ContributesAndroidInjector
注解并指定modules为HomeModule:
@Modulepublic 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(); }}
完整源码:https://github.com/yuweiguocn/AndroidDemo
总结
本文对MVP架构模式结合Dagger2的使用提供一个使用模板,后续会对Dagger2提供的注解详细讲解,敬请关注。
参考
- https://google.github.io/dagger/
更多相关文章
- Android(安卓)中 WebView 使用漏洞相关介绍
- 想看看Android(安卓)L的效果,结果导致Eclispe无法使用,最终修复
- ANDROID音频系统散记之一:A2dpAudioInterface
- Android控件EditText之点击软键盘中的回车键不换行,而是跳到下一
- android对html支持接口总结
- Android上的C/C++调用Java问题(转载)
- 无废话Android之android下junit测试框架配置、保存文件到手机内
- Android(安卓)匿名共享内存Java接口分析
- 如何在Android中使用OpenCV