前言
本系列共三篇:
Android MVP入门到进阶之-简单入门
Android MVP入门到进阶之-结合Dagger2
Android MVP入门到进阶之- 系统框架集成(完结)
昨天,写了一篇mvp入门框架搭建文章
Android MVP入门到进阶之-简单入门
通过一个简单的例子,介绍mvp的简单使用,今天我们依然从demo入手介绍mvp模式结合注解框架Dagger2的使用,注意本文不介绍dagger2的用法,只简单介绍dagger2结合mvp框架如何进一步解耦。如果不了解dagger2的用法,请查阅官方文档Dagger2,或者阅读以下文章:
Dagger2 入门,以初学者角度
dagger 2 详解
在此我们感谢以上文章的作者,给我提供好的学习指南。
使用Dagger2有什么好处?
1.增加开发效率、省去重复的简单体力劳动
2.更好的管理类实例
3.解耦合
话不多少,开始写demo吧
添加依赖
在module的build.gradle中添加Dagger2 的依赖
implementation 'com.google.dagger:dagger:2.16'
implementation 'com.google.dagger:dagger-android:2.16'
implementation 'com.google.dagger:dagger-android-support:2.16'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
书写AppModule类,用于提供应用Appliction 的实例
/**
* @desc AppModule
* @author Marlon
* @date 2018/10/9
*/
@Module
public class AppModule {
private final App application;
public AppModule(App application) {
this.application = application;
}
@Provides
@Singleton
App provideApplicationContext() {
return application;
}
}
书写AppComponent接口 用于管理AppModule
/**
* @desc AppComponent 用于提供Application
* @author Marlon
* @date 2018/10/9
*/
@Singleton
@Component(modules = {AppModule.class/*, HttpModule.class*/})
public interface AppComponent {
App getContext(); // 提供App的Context
// BaseApiService retrofitHelper(); //提供http请求的帮助类这里暂时不管,后续讲
}
书写ActivityModule接口 用于提供Activity实例
/**
* @desc ActivityModule
* @author Marlon
* @date 2018/10/9
*/
@Module
public class ActivityModule {
private Activity mActivity;
public ActivityModule(Activity activity) {
this.mActivity = activity;
}
@Provides
@ActivityScope
public Activity provideActivity() {
return mActivity;
}
}
书写ActivityComponent接口 注册要用于依赖注入的Activity
/**
* @desc ActivityComponent 用于管理需要进行依赖注入的Activity
* @author Marlon
* @date 2018/10/9
*/
@ActivityScope
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
Activity getActivity();
void inject(MainActivity mainActivity);//用于注入MainActivity
void inject(LoginActivity loginActivity);//用于注入LoginActivity
//TODO 后续需要注入的Activity类都可以在这里添加 中像上面一样写就好了
}
书写App类
/**
* @desc App
* @author Marlon
* @date 2018/10/9
*/
public class App extends Application {
private static App instance;
public static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static synchronized App getInstance() {
return instance;
}
public static AppComponent getAppComponent() {
if (appComponent == null) {
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(instance))
// .httpModule(new HttpModule()) 创建网络请求的module这里暂时不管,
.build();
}
return appComponent;
}
}
在LoginActivity中 去掉了 new LoginPresenter 在 LoginPresenter 上添加了注解@Inject
/**
* @desc LoginActivity
* @author Marlon
* @date 2018/10/9
*/
public class LoginActivity extends AppCompatActivity implements LoginContract.View {
@Inject
LoginPresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
DaggerActivityComponent.builder().appComponent(App.getAppComponent()).activityModule(new ActivityModule(this)).build().inject(this);
mPresenter.attachView(this);
}
@Override
public void gotoMain() {
startActivity(new Intent(this,MainActivity.class));
}
@Override
public void showToast(String msg) {
Toast.makeText(this.getApplicationContext(),msg,Toast.LENGTH_SHORT).show();
}
public void onClickLogin(View view) {
mPresenter.login();
}
}
再看一下修改后的LoginPresenter
/**
* @author Marlon
* @desc
* @date 2018/10/8
*/
public class LoginPresenter implements LoginContract.Presenter {
LoginActivity view;
@Inject
public LoginPresenter() {
}
@Override
public void login() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
view.showToast("登录成功");
view.gotoMain();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void attachView(LoginContract.View view) {
this.view = (LoginActivity) view;
}
@Override
public void detachView() {
this.view = null;
}
}
到这里我们的demo大致内容就已经结束了,是不是很简单,就是几个简单的注解,我们就实现了Presenter和View的完全解耦,没有看到 new
关键字,也没有看到构造方法中的参数,有没有很美好?
这个项目demo在这里,里面有更多的细节知识,有需要的你可以查阅一下,如果觉得对你有帮助,请给个小心心哈,如果遇到什么问题,也可以给我反馈一下,大家共同学习嘛,
本项目demo依然是基于官方# googlesamples/android-architecture的todo‑mvp‑dagger分支简化而来,去除大部分我们平时开发很少用到的注解,如果你有足够好的Dagger2基础,你可以查阅官方demo,有更多的知识等着你哟。
总结
通过这两天的总结,我们队mvp及配合dagger有了一定的理解,想想原来mvp+dagger的架构搭建原来如此的简单,是的,对于我们出学者而言,确实是有一定的收获了,但是我们项目还是很简单,还没有涉及到网络请求呢,我们在公司做项目怎么能缺少网络请求呢,这个是必不可少的。所以我们将在下一篇总结一下
Android MVP入门到进阶之- 系统框架集成(完结)
本文章为原创博客,转载请注明出处!