Android Dagger2+MVP使用步骤及生成代码分析

本文详细介绍了在Android环境中使用Dagger2结合MVP模式的步骤,包括添加依赖、创建Component、view、presenter和model类,以及Rebuild Project后的生成代码分析。通过Component,建立了model、presenter和view之间的注入关系,并通过自动生成的代码实现组件的初始化。重点阐述了model、presenter和view的绑定和初始化流程。
摘要由CSDN通过智能技术生成

1.添加依赖:


dependencies {
 	...
    //dagger2
    implementation 'com.google.dagger:dagger:2.11'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.11'
    //kapt 'com.google.dagger:dagger-compiler:2.11' //如果是kotlin开发环境用这个,否则不会根据注解生成相关类
   	...
}

2.创建Component类

@Component()
public interface ActivityComponent {
    void inject(MainActivity activity);
}

3.创建view、presenter、model类

public class MainActivity extends BaseDrawerActivity{
    @Inject
    MainPresenter presenter;
    @Override
    protected int findLayoutId() {
        return R.layout.activity_main;
    }
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

public class MainPresenter {
    @Inject
    MainModel model;
    @Inject
    public MainPresenter() {
    }
}

public class MainModel {
    @Inject
    public MainModel() {
    }
}

4.build->Rebuild Project
在这里插入图片描述
5.成功后会看到如下生成类,我是kotlin环境下,如果是Java环境下就会在apt路径下。
在这里插入图片描述
6.调用注入:

public class MainActivity extends AppCompatActivity {
    @Inject
    MainPresenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        DaggerActivityComponent.builder().build().inject(this);
    }
}

如此activity绑定了presenter对象,presenter绑定了model对象。
下边是Component流程图:
在这里插入图片描述
整个component的作用就是组合注入关系。
首先根据Inject创建一个model的工厂类,然后在工厂类里面调用get方法会创建一个model。

public final class MainModel_Factory implements Factory<MainModel> {
  private static final MainModel_Factory INSTANCE = new MainModel_Factory();
	//主动调用四、new 一个model对象。
  @Override
  public MainModel get() {
    return new MainModel();
  }

  public static Factory<MainModel> create() {
    return INSTANCE;
  }
}

然后根据吧modelfactory注入到PresenterMembersInjector中。

public final class MainPresenter_MembersInjector implements MembersInjector<MainPresenter> {
  private final Provider<MainModel> modelProvider;
	//2.modelfactory成为成员变量
  public MainPresenter_MembersInjector(Provider<MainModel> modelProvider) {
    assert modelProvider != null;
    this.modelProvider = modelProvider;
  }
	//1.component调用,在这里传入modelfactory,然后根据modelfactory生成一个presenter成员管理对象。
  public static MembersInjector<MainPresenter> create(Provider<MainModel> modelProvider) {
    return new MainPresenter_MembersInjector(modelProvider);
  }
	//主动调用三、初始化presenter中的model对象
  @Override
  public void injectMembers(MainPresenter instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    instance.model = modelProvider.get();
  }
  public static void injectModel(MainPresenter instance, Provider<MainModel> modelProvider) {
    instance.model = modelProvider.get();
  }
}

然后根据PresenterMembersInjector(model注入对象)生成presenterfactory:

public final class MainPresenter_Factory implements Factory<MainPresenter> {
  private final MembersInjector<MainPresenter> mainPresenterMembersInjector;
	//2.把model注入对象保存到工厂中
  public MainPresenter_Factory(MembersInjector<MainPresenter> mainPresenterMembersInjector) {
    assert mainPresenterMembersInjector != null;
    this.mainPresenterMembersInjector = mainPresenterMembersInjector;
  }
	//根据mainPresenterMembersInjector和新建的Mainpresenter生成一个包含调用关系的Mainpresenter对象
	//主动调用二、返回一个包含model调用关系的presenter
  @Override
  public MainPresenter get() {
    return MembersInjectors.injectMembers(mainPresenterMembersInjector, new MainPresenter());
  }
	//1.根据绑定model注入对象新建一个presenterfactory
  public static Factory<MainPresenter> create(
      MembersInjector<MainPresenter> mainPresenterMembersInjector) {
    return new MainPresenter_Factory(mainPresenterMembersInjector);
  }
}

根据view和presenterfactory生成view的注入对象。

public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
  private final Provider<MainPresenter> presenterProvider;
	//2.保存presenter工厂
  public MainActivity_MembersInjector(Provider<MainPresenter> presenterProvider) {
    assert presenterProvider != null;
    this.presenterProvider = presenterProvider;
  }
	//1.新建注入对象(presenter工厂)
  public static MembersInjector<MainActivity> create(Provider<MainPresenter> presenterProvider) {
    return new MainActivity_MembersInjector(presenterProvider);
  }
	//主动调用一、确定view中inject的presenter对象的值
  @Override
  public void injectMembers(MainActivity instance) {
    if (instance == null) {
      throw new NullPointerException("Cannot inject members into a null reference");
    }
    instance.presenter = presenterProvider.get();
  }

  public static void injectPresenter(
      MainActivity instance, Provider<MainPresenter> presenterProvider) {
    instance.presenter = presenterProvider.get();
  }
}

写的可能有点乱,在自动生成的代码中主要两个功能:

  1. 一个绑定关系(model->presenter->view)
  2. 一个关联初始化过程(view->presenter->model)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值