Android 简单封装一个 MVP 基类
对于 MVP 架构我想大家都不陌生吧, 对于现在的主流框架非 MVP + RxJava + Retrofit 莫属了, GitHub 上也有很多优秀的开源项目对其进行了很好的封装有时候看一些优秀的开源项目是一种享受, 但自己如果能从这里学到并实现一些自己想实现的需求我想那更是一种享受这里很简单的去实现一个 MVP 的基类, 其它扩展功能可以自行添加Model
publicabstractclassBaseModel{
}
Presenter
publicabstractclassBasePresenter
V>{
publicM mIModle;
publicV mIView;
publicvoidattachV(V v){
this.mIView=v;
if(mIModle==null){
mIModle=createModel();
}
}
// 当 View 被销毁掉时删除 Presenter 层对 View 层的引用
publicvoiddetachV(){
mIView=null;
}
publicabstractM createModel();
}
View
publicinterfaceIBaseView{
}
@SuppressLint("Registered")
publicabstractclassBaseMvpActivityextendsAppCompatActivityimplementsIBaseView{
publicP mPresenter;
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
if(mPresenter==null){
mPresenter=createPresenter();
}
mPresenter.attachV(this);
}
// 当 View 被销毁掉时删除 Presenter 层对 View 层的引用
@Override
protectedvoidonDestroy(){
super.onDestroy();
mPresenter.detachV();
}
publicabstractP createPresenter();
}
这里 Mode 和 View 的基类里什么都没有, 其实我们知道一般封装基类的目录是为了简化项目代码, 提高开发效率所以这里两个基类里面一般根据我们自己需求去实现Example
publicinterfaceExampleDataSource{
interfaceOnExampleFinishListener{
voidloading();
voidonSuccess();
voidonError();
}
voidload(OnExampleFinishListenerlistener);
}
ExampleDataSource 接口实现的是 ExampleModel, 而在它的内部接口 OnExampleFinishListener 是 Model 层的回调接口, 它们真正实现是在 Presenter 层对于获取到数据后 (成功或失败) 就是通过这个回调接口将数据传递 Presenter 层publicclassExampleModelextendsBaseModelimplementsExampleDataSource{
/**
* model 层主要用来进行数据存储操作, 例如: 数据读写和网络请求
* 这里进行下模拟耗时操作
* @param listener
*/
@Override
publicvoidload(finalOnExampleFinishListenerlistener){
// 加载中状态
listener.loading();
newHandler().postDelayed(newRunnable(){
@Override
publicvoidrun(){
// 获取成功后进行回调
listener.onSuccess();
}
},2000);
}
}
这里我们在 Model 层模拟下耗时操作(例如: 网络请求), 然后将得到的数据结果通过回调方法传递到 Presenter 层publicinterfaceExampleContractextendsIBaseView{
interfaceExamplePresent{
voidloadData();
}
interfaceExampleView{
voidloadResult(Stringresult);
voidshowLoading();
voidloadFinish();
}
}
这里我们将 Presenter 接口和 View 接口放在一个类中, 这样可以使我们能够清晰的看到在 Presenter 层和 View 层中有哪些功能, 方便我们以后维护publicclassExamplePresenterextendsBasePresenterimplementsExampleContract.ExamplePresent,ExampleDataSource.OnExampleFinishListener{
@Override
publicvoidloadData(){
mIModle.load(this);
}
@Override
publicvoidloading(){
mIView.showLoading();
}
@Override
publicvoidonSuccess(){
mIView.loadResult("成功");
mIView.loadFinish();
}
@Override
publicvoidonError(){
}
@Override
publicExampleModelcreateModel(){
returnnewExampleModel();
}
}
从 Presenter 层我们可以看出, 首先调用 Model 层的接口获取数据进行一些逻辑操作然后通过 View 层接口实现数据的展示publicclassMainActivityextendsBaseMvpActivityimplementsExampleContract.ExampleView{
privateTextViewtvName;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvName=findViewById(R.id.tv_name);
// 加载数据
mPresenter.loadData();
}
@Override
publicExamplePresentercreatePresenter(){
returnnewExamplePresenter();
}
// 返会数据结果
@Override
publicvoidloadResult(Stringresult){
tvName.setText(result);
}
// 加载过程
@Override
publicvoidshowLoading(){
tvName.setText("正在加载, 请稍等");
}
// 加载结束
@Override
publicvoidloadFinish(){
}
}
嗯, 好了! 一个很简单的 MVP 基类就实现了, 对于使用轮子来说, 我们更应该试着一点点自己去实现它, 从简单到复杂慢慢就会更加的了解它贴上项目源码更参考