Dagger2的作用
传统的MVP模式Activity一直持有Presenter的引用,Presenter也一直持有Activity的引用,形成耦合。依赖注入框架Dagger2可以解开Activity和Presenter的耦合。MVP+Dagger2的架构也是现在的主流。
最后效果是形成这样的结构
依赖
annotationProcessor ‘com.google.dagger:dagger-compiler:2.11’
compile ‘com.google.dagger🗡2.11’
compile ‘javax.annotation:javax.annotation-api:1.2’
以LoginActivity为例,讲一下使用步骤
- 新建LoginContract接口(Activity和Presenter的交互都通过该接口来调用)
public interface LoginContract {
interface View {
void loginSuccess();
}
interface Presenter {
void login();
}
}
- 新建LoginPresenterModule
@Module
class LoginPresenterModule {
private Context mContext;
private LoginContract.View mView;
LoginPresenterModule(Context context, LoginContract.View view){
mContext = context;
mView = view;
}
// 提供LoginPresenter实例化对象
@Provides
LoginContract.Presenter providePresenter() {
return new LoginPresenter(mContext, mView);
}
}
这里使用了两个注解,作用是将Presenter实例化
- 新建LoginComponent接口
@Component(modules = LoginPresenterModule.class)
public interface LoginComponent {
void inject(LoginActivity activity);
}
- 新建LoginPresenter,并实现LoginContract.Presenter
public class LoginPresenter implements LoginContract.Presenter {
// 通过Module的构造,获得LoginActivity对象
private Context mContext;
private LoginContract.View mView;
LoginPresenter(Context context, LoginContract.View view) {
mContext = context;
mView = view;
}
@Override
public void login() {
Log.i("System", "Presenter Login");
mView.loginSuccess();
}
}
- 最后是新建LoginActivity,并实现LoginContract.View
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
// 注入获得LoginPresenter对象
@Inject
LoginContract.Presenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// Rebuild项目时,会生成以Dagger为前缀的Component类,在这里完成依赖注入
DaggerLoginComponent.builder()
.loginPresenterModule(new LoginPresenterModule(this, this))
.build()
.inject(this);
initListener();
}
private void initListener() {
// 点击login,调用LoginPresenter.login方法,实现登录逻辑后,Presenter通过View对象回调到Activity
findViewById(R.id.btn_login).setOnClickListener(new android.view.View.OnClickListener() {
@Override
public void onClick(android.view.View view) {
mPresenter.login();
}
});
}
@Override
public void loginSuccess() {
Log.i("System", "View LoginSuccess: ");
}
}
总结
- @Inject 带有此注解的属性或构造方法,Dagger2会实例化有此注解的类
- @Module 用来提供依赖,里面定义一些用 @Provides 注解的以 provider开头的方法,这些方法就是所提供的依赖,Dagger2会在该类中寻找实例化某个类所需要的依赖
- @Component 用来将 @Inject 和 @Module 连接起来的桥梁,从Module中获取依赖并将依赖注入给Inject
注意
- 最后Rebuild项目,会生成以Dagger为前缀的Component类,在Activity中完成依赖注入
DaggerILoginActivityComponent.builder()
.loginActivityModule(new LoginActivityModule(this))
.build()
.inject(this);