本系列博客主要用于本身学习积累,顺便帮助新手入门,若有问题,多多包涵。更详细的一些使用能够看看其余更加详细的博客。android
dagger android 学习(一):dagger基础使用
dagger android 学习(二):AndroidInjector的使用
dagger android 学习(三):ContributesAndroidInjector的进一步优化
dagger android 学习(四):基于dagger2的mvp架构git
dagger2的基本使用已经介绍完了,那么接下来就介绍一下,dagger2赶上mvp架构会擦出怎么样的火花。
mvp的架构想必就不用再谈了。model-view-presenter,每次咱们都须要建立这三个必有的类,而且咱们还须要在presenter中依赖view,view中建立presenter对象,而model进行数据处理这个则相对独立。那么dagger2能不能帮咱们省去一些代码呢?答案是确定的。github
首先这个总体模块的构造和上篇文章同样,全部重复的东西就再也不论述,这里只论述关于model-view-presenter如何去处理,而@model @component具体怎么写就不阐述了。架构
建立接口IBaseView,之后全部的View实现这个接口便可。app
public interface IBaseView {
}
复制代码
建立BasePresenter,这个presenter提供了View的获取,这样咱们就能够在presenter处理完逻辑后返回给view去刷新ui。ide
public class BasePresenter<T extends IBaseView> {
private T view;
public T getView() {
return view;
}
public void attachView(T view){
this.view = view;
}
}
复制代码
建立daggerMvpActivity,这个类是之后全部Activity的基类,经过实现类,就自动对presenter、view实现了依赖注入,这样咱们就能够很方便的获取presenter和view,无需再进行new Presenter以及setView的操做。post
open class DaggerMvpActivity<T: BasePresenter<K>, K: IBaseView>: AppCompatActivity(), IBaseView {
@Inject lateinit var presenter: T
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
presenter.attachView(this as K)
}
}
复制代码
ActivityComponet与以前并没有太大区别,只须要加入将以前的DaggerMvpActivity便可。学习
@Subcomponent(modules = [AndroidInjectionModule::class])
interface ActivityComponet: AndroidInjector<DaggerMvpActivity<BasePresenter<IBaseView>, IBaseView>>{
//每个继承BaseActivity的Activity,都共享同一个SubComponent
@Subcomponent.Builder
abstract class Builder: AndroidInjector.Builder<DaggerMvpActivity<BasePresenter<IBaseView>, IBaseView>>()
}
复制代码
接下来,咱们就能够按照以前的方法建立并使用Activity了。优化
public class MainActivity extends DaggerMvpActivity<MainPresenter, MainView> implements MainView {
@Inject
A2 a2;
@Inject
SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, Main2Activity.class));
}
});
a2.someThingA();
sp.toString();
presenter.doPresenter();
}
@Override
public void showToast() {
Log.e("MainActivity", "showToast");
}
}
public class MainPresenter extends BasePresenter<MainView> {
@Inject
public MainPresenter(){
}
public void doPresenter(){
Log.e("MainPresenter", "doPresenter");
getView().showToast();
}
}
复制代码
上面的Activity与Presenter使用过程当中咱们就再也见不到new Presenter(view)这种操做了。 dagger2的用法还有许多,这里先不详细介绍了,这几篇模块主要仍是积累使用。若有问题,多多包涵。ui
demo地址:[app-version3-mvp]模块(github.com/JavaNoober/…)