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

相關文章
相關標籤/搜索