今天记录下 Dagger.Android 的学习内容
一.MVP的学习
1.Model部分,可以定义Model接口类和Model类,bean类,这里仅仅定义了 Model类和Bean类,即MainModel类和Student类
(1)Bean数据–Student类
public class Student {
private String name = null;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
(2)Model 部分
public class MainModel {
private Student student = null;
@Inject
public MainModel() {
student = new Student("liu");
}
public String getName(){
return student.getName();
}
}
2.Presenter 部分,定义 Presenter 接口类和 Presenter 类
(1)Presenter接口和view接口定义在一个 Contract类中了
public interface MainContract {
interface View{
void getName(String name);
}
interface Presenter{
void showStuName();
}
}
(2)Presenter部分 里面使用到 view 和 Model,一般两个变量会定义成接口类型
public class MainPresenter implements MainContract.Presenter{
//一般会定义成接口类型
private final MainActivity view;
private final MainModel model;
@Inject
public MainPresenter(MainActivity view) {
Log.e("MainPresenter","MainPresenter");
if(view == null)
{
Log.e("MainPresenter","view is null");
}
this.view = view;
this.model = new MainModel();
}
@Override
public void showStuName() {
String name = model.getName();
Log.e("MainPresenter","showStuName");
view.getName(name);
}
}
3.View部分,定义View接口类,实现在Actvity中;这样数据就从Model传到了View中,其中Presenter作为承接、操作控制部分
public class MainActivity extends BaseActivity implements MainContract.View {
@Inject
MainPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
//Dagger.android 添加注入
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
Log.e("MainActivity","onCreate");
presenter.showStuName();
}
@Override
public void getName(String name) {
Log.e("MainActivity","onCreate"+ name);
}
}
同时使用Presenter对象进行数据操作,某些数据通过view接口类函数返回
二.Dagger.android 部分
1.添加Application类,目前我是选择让其继承 DaggerApplication
public class MyApplication extends DaggerApplication {
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
//添加本代码
return DaggerMyAppComponent.builder().create(this);
}
}
2.添加 Application 的 Component 和 Module,这两个可相当于总的集合集,其他定义的Activity和对应的component作为子模块
(1)Application 的 Component部分
@Singleton
//注意下面的总Module---ActivitiesModule
@Component(modules ={
AndroidInjectionModule.class,
AndroidSupportInjectionModule.class,
ActivitiesModule.class
})
interface MyAppComponent extends AndroidInjector<MyApplication>{
@Component.Builder
abstract class Builder extends AndroidInjector.Builder<MyApplication> {
}
}
(2)Module部分
//这个里面添加各种对应的Activity的子Compontent
@Module(subcomponents = {
MainActivitySubComponent.class,
})
public abstract class ActivitiesModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity> bindMainActivityInjectorFactory(
MainActivitySubComponent.Builder builder);
//可根据上面的Module中的Activity 仿照MAinActivity 添加 上面的类似代码
}
3.Activity对应的Module和Component,该部分在MVP中的作用就是进一步解耦 Presenter部分,将 Presenter 在 Actvity的部分写到 Module 中(Component 没有什么操作),然后 Module会与Activity 有交互
(1)Actvity的 Component部分
@Subcomponent(modules = MainActivityModule.class)
@ActivityScope
public interface MainActivitySubComponent extends AndroidInjector<MainActivity>{
@Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
(2)Actvity的 Module部分
@Module
public class MainActivityModule {
@Provides
public MainPresenter provideStudentPresenter(){
Log.e("MainActivityModule","xtk provideStudentPresenter");
return new MainPresenter(new MainActivity());
}
}
以上为个人学习部分
代码地址(需要1积分):
https://download.csdn.net/download/shiluohuashengmi/10487978