android mvp 封装base,Android 简单封装一个 MVP 基类

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 基类就实现了, 对于使用轮子来说, 我们更应该试着一点点自己去实现它, 从简单到复杂慢慢就会更加的了解它贴上项目源码更参考

来源: http://www.jianshu.com/p/2f81197b5798

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值