dagger android 学习(四):基于dagger2的mvp架构

本系列博客主要用于本身学习积累,顺便帮助新手入门,若有问题,多多包涵。更详细的一些使用能够看看其余更加详细的博客。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具体怎么写就不阐述了。架构

View

建立接口IBaseView,之后全部的View实现这个接口便可。app

public interface IBaseView {
}
复制代码

Presenter

建立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

建立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

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/…)

相关文章
相关标签/搜索