1. 程式人生 > >Androd——Dagger2(進一步解耦MVP)

Androd——Dagger2(進一步解耦MVP)

Dagger2的作用

依賴注入框架解開Activity和Presenter的耦合(因為MVP模式中Activity持有Presenter的引用,同時Presenter也持有View的引用,這樣Activity和presenter就耦合了)

使用方法(以LoginActivity為例)

  1. 在專案中新增依賴
dependencies {
    ...

    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
    compile 'com.google.dagger:dagger:2.11'
    compile 'javax.annotation:javax.annotation-api:1.2'
}
  1. 新建ILoginActivityContract介面,使用更方便
public interface ILoginActivityContract {

    interface IPresenter {

    }

    interface IModel {

    }

    interface IView {

    }
}
  1. 新建LoginActivity
//實現ILoginActivityContract.IView介面
public class LoginActivity extends AppCompatActivity implements ILoginActivityContract.IView {

    @Inject
    ILoginActivityContract.IPresenter mPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }
}
  1. 新建LoginActivityPresenter
//實現ILoginActivityContract.IPresenter介面
public class LoginActivityPresenter implements ILoginActivityContract.IPresenter {
    
}

這樣還無法完成注入,還需要兩個重要的東西(Module類和Component介面)

  1. 新建LoginActivityModule
@Module
public class LoginActivityModule {
    
    private ILoginActivityContract.IView mView;
    
    public LoginActivityModule(ILoginActivityContract.IView view){
        mView = view;
    }
    
    @Provides
    public ILoginActivityContract.IPresenter providerPresenter(){
        return new LoginActivityPresenter();
    }
}

這裡使用了兩個註解,作用是將Presenter例項化

  1. 新建ILoginActivityComponent介面
@Component(modules = LoginActivityModule.class)
public interface ILoginActivityComponent {
    void inject(LoginActivity view);
}
  1. 最後Rebuild專案,會生成以Dagger為字首的Component類,在Activity中完成依賴注入
DaggerILoginActivityComponent.builder()
	.loginActivityModule(new LoginActivityModule(this))
	.build()
	.inject(this);

總結

  • @Inject 帶有此註解的屬性或構造方法,Dagger2會例項化有此註解的類
  • @Module 用來提供依賴,裡面定義一些用 @Provides 註解的以 provider 開頭的方法,這些方法就是所提供的依賴,Dagger2會在該類中尋找例項化某個類所需要的依賴
  • @Component 用來將 @Inject@Module 連線起來的橋樑,從Module中獲取依賴並將依賴注入給Inject

注意

  • Activity中實現Contract介面中的View,Presenter中實現介面中的Presenter