Androd-Dagger2(进一步解耦MVP)

本文详细介绍了依赖注入框架Dagger2在MVP架构中的应用,展示了如何使用Dagger2解开Activity和Presenter之间的耦合,以及具体的实现步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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为例,讲一下使用步骤

  1. 新建LoginContract接口(Activity和Presenter的交互都通过该接口来调用)
public interface LoginContract {

    interface View {
        void loginSuccess();
    }

    interface Presenter {
        void login();
    }
}
  1. 新建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实例化

  1. 新建LoginComponent接口
@Component(modules = LoginPresenterModule.class)
public interface LoginComponent {
    void inject(LoginActivity activity);
}
  1. 新建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();
    }
}
  1. 最后是新建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);

Demo在此

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值