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

猜你喜欢

转载自blog.csdn.net/weixin_42164949/article/details/83858885