Androd——Dagger2(進一步解耦MVP)
阿新 • • 發佈:2018-11-09
Dagger2的作用
依賴注入框架解開Activity和Presenter的耦合(因為MVP模式中
Activity持有Presenter的引用
,同時Presenter也持有View的引用
,這樣Activity和presenter就耦合了)
使用方法(以LoginActivity為例)
- 在專案中新增依賴
dependencies { ... annotationProcessor 'com.google.dagger:dagger-compiler:2.11' compile 'com.google.dagger:dagger:2.11' compile 'javax.annotation:javax.annotation-api:1.2' }
- 新建ILoginActivityContract介面,使用更方便
public interface ILoginActivityContract {
interface IPresenter {
}
interface IModel {
}
interface IView {
}
}
- 新建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); } }
- 新建LoginActivityPresenter
//實現ILoginActivityContract.IPresenter介面
public class LoginActivityPresenter implements ILoginActivityContract.IPresenter {
}
這樣還無法完成注入,還需要兩個重要的東西(Module類和Component介面)
- 新建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例項化
- 新建ILoginActivityComponent介面
@Component(modules = LoginActivityModule.class)
public interface ILoginActivityComponent {
void inject(LoginActivity view);
}
- 最後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