本系列博客主要用於本身學習積累,順便幫助新手入門,若有問題,多多包涵。更詳細的一些使用能夠看看其餘更加詳細的博客。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/…)