开发一个App,和起房子应该有殊途同归之处,起房子须要画好设计图纸,而咱们开发App则须要先设计好App整个架构模式。目前Android通常有MVC、MVP和MVVM,本文则先来讲说MVP架构。在了解MVP架构以前,有人可能会说,MVP架构是否是有点落后了,可是我想说,若是你公司有老项目,他就是用MVP架构写的,这时候咱们MVP知识是否是就派上用场了;任何架构都有它存在的理由,学习架构的思想才是关键。MVP分别表明Model、View、Presenter三个英文字母,和传统的MVC 相比,C替换成了P。Presenter英文单词有主持人意思,也就是说Presenter是View 和 Model 的主持人,按照惯例咱们先来看两张图。android
/**
* @author maoqitian
* @Description View 的基类
*/
public interface BaseView {
/**
* 正常显示
*/
void showNormal();
/**
* 显示错误
*/
void showError();
/**
* 正在加载
*/
void showLoading();
/**
* 显示错误信息
* @param errorMsg 错误信息
*/
void showErrorMsg(String errorMsg);
}
复制代码
/**
* @author maoqitian
* @Description Presenter 基类接口
*/
public interface AbstractBasePresenter<T extends BaseView> {
/**
* 绑定View
* @param view
*/
void attachView(T view);
/**
* 解绑View
*/
void detachView();
}
复制代码
/**
* @author maoqitian
* @Description activity基类
*/
public abstract class AbstractActivity extends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayout());
onViewCreated();
initToolbar();
initEventAndData();
}
/**
* view 的建立 留给子类实现
*/
protected abstract void onViewCreated();
/**
* 初始化 toolbar
*/
protected abstract void initToolbar();
/**
* 初始化数据留给子类实现
*/
protected abstract void initEventAndData();
/**
* 获取布局对象 留给子类实现
*/
protected abstract int getLayout();
}
复制代码
/**
* @author maoqitian
* @Description MVP BaseActivity 基类
*/
public abstract class BaseActivity <T extends AbstractBasePresenter> extends AbstractActivity implements BaseView{
protected T mPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mPresenter = createPresenter();
super.onCreate(savedInstanceState);
}
@Override
protected void onViewCreated() {
if (mPresenter != null) {
mPresenter.attachView(this);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mPresenter != null){
mPresenter.detachView();
mPresenter = null;
}
}
/**
* 建立Presenter
*/
protected abstract T createPresenter();
@Override
public void showNormal() {
}
@Override
public void showError() {
}
@Override
public void showLoading() {
}
@Override
public void showErrorMsg(String errorMsg) {
}
}
复制代码
/**
* @author maoqitian
* @Description 基于Presenter封装
*/
public class RxBasePresenter<T extends BaseView> implements AbstractBasePresenter<T>{
protected T mView;
private DataClient mDataClient;
public RxBasePresenter(DataClient dataClient){
this.mDataClient=dataClient;
}
@Override
public void attachView(T view) {
this.mView=view;
}
@Override
public void detachView() {
this.mView = null;
}
}
复制代码
public interface MainContract {
interface MainView extends BaseView{
void showMainData();
}
interface MainActivityPresenter extends AbstractBasePresenter<MainView>{
void getMainData();
}
}
复制代码
/**
* @author maoqitian
* @Description MainPresenter (Presenter)
*/
public class MainPresenter extends RxBasePresenter<MainContract.MainView> implements MainContract.MainActivityPresenter {
//(Model)
private DataClient mDataClient;
public MainPresenter(DataClient dataClient) {
super(dataClient);
this.mDataClient = dataClient;
}
@Override
public void attachView(MainContract.MainView view) {
super.attachView(view);
}
//获取数据
@Override
public void getMainData() {
//mDataClient 网络请求获取数据
.......
// 数据获取成功展现数据
mView.showMainData();
}
}
/**
* @author maoqitian
* @Description MainActivity (View)
*/
public class MainActivity extends BaseActivity<MainPresenter>implements MainContract.MainView{
..........
@Override
protected MainPresenter createPresenter() {
return new MainPresenter(new DataClient());
}
@Override
protected void initEventAndData() {
mPresenter.getMainData();
}
@Override
public void showMainData() {
//显示数据
}
}
复制代码
dependencies {
implementation 'com.google.dagger:dagger:2.22.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.22.1'
//
implementation 'com.google.dagger:dagger-android:2.22.1'
implementation 'com.google.dagger:dagger-android-support:2.22.1'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.22.1'
}
复制代码
public class MainPresenter extends RxBasePresenter<MainContract.MainView> implements MainContract.MainActivityPresenter {
private DataClient mDataClient;
//@Inject注解表示Dagger2 能够从这获取Presenter 实例
@Inject
public MainPresenter(DataClient dataClient) {
super(dataClient);
this.mDataClient = dataClient;
}
}
复制代码
/**
* @author maoqitian
* @Description MVP BaseActivity 基类
*/
public abstract class BaseActivity <T extends AbstractBasePresenter> extends AbstractSimpleActivity implements BaseView, HasFragmentInjector,HasSupportFragmentInjector {
//Presenter 对象注入 (注意不能使用 private )
@Inject
protected T mPresenter;
//手动实现DaggerAppCompatActivity功能
@Inject DispatchingAndroidInjector<Fragment> supportFragmentInjector;
@Inject DispatchingAndroidInjector<android.app.Fragment> frameworkFragmentInjector;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//必须在super.onCreate以前调用AndroidInjection.inject
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
@Override
public AndroidInjector<Fragment> supportFragmentInjector() {
return supportFragmentInjector;
}
@Override
public AndroidInjector<android.app.Fragment> fragmentInjector() {
return frameworkFragmentInjector;
}
}
复制代码
/**
* @author maoqitian
* @Description MainActivity 能够提供的注入对象Module
* @Time 2019/3/27 0027 23:59
*/
@Module
public abstract class MainActivityModule {
@ActivityScope
@Binds
abstract MainContract.MainActivityPresenter bindPresenter(MainPresenter presenter);
}
复制代码
/**
* @author maoqitian
* @Description 用于生成Activity注入器的Module,使用@ContributesAndroidInjector注解并指定modules为
* @Time 2019/4/14 0014 14:09
*/
@Module
public abstract class ActivityBindingModule {
@ActivityScope
@ContributesAndroidInjector(modules = MainActivityModule.class)
abstract MainActivity contributeMainActivity();
}
复制代码
@Module
public class MyAppModule {
@Provides
@Singleton
public DataClient providerDataClient(){
return new DataClient();
}
}
复制代码
@Singleton
@Component(modules = {
MyAppModule.class,
ActivityBindingModule.class,
AndroidSupportInjectionModule.class
})
public interface AppComponent extends AndroidInjector<MyApplication> {
}
复制代码
public class MyApplication extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent.create();
}
}
复制代码