想要设计mvp首先需要设计我们的基础model,基础view,基础presenter
基础model我们的业务处理基础类是一个接口可以在里面添加我们需要的共通业务接口代码如下:

public interface BaseModel {
}

简单吧我这里因为没共通业务处理所以就没添加任何接口方法
再来个差不多一样简单的我们的共通view代码如下

public interface BaseView { void showLoading(String title);void stopLoading();void showErrorTip(String msg);
}

这几个方法可以没有哦基本内容跟basemodel一致
最后就是我们的基础presenter类了

public abstract class BasePresenter<T, E> {public Context mContext;public E mModel;public T mView;public void setVM(T v, E m) {this.mView = v;this.mModel = m;this.onStart();}//presenter开始public void onStart() {}//presenter结束public void onDestroy() {}
}

在这里我们通过setVM方法将model跟view注入到我们的presenter中,当然我们也可以通过构造方法将model跟view注入到presenter中实现presenter对model跟view对象的持有操作。
这样的话我们的基础类就都有啦那接下来我们来看看如何运用它们,首先看看我们的baseActivity是如何处理的。

public abstract class BaseActivity<T extends BasePresenter, E extends BaseModel> extends AppCompatActivity {public Context mContext;public T mPresenter;public E mModel;@Overridepublic void onCreate(Bundle savedInstanceState) {doBeforeSetcontentView();super.onCreate(savedInstanceState);setContentView( getLayoutId());mContext = this;mPresenter = TUtil.getT(this, 0);mModel = TUtil.getT(this, 1);if (mPresenter != null) {mPresenter.mContext = this;}initPresenter();initView();}//获取布局文件public abstract int getLayoutId();//简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通public abstract void initPresenter();//初始化viewpublic abstract void initView();//设置layout前配置private void doBeforeSetcontentView() {AppManager.getAppManager().addActivity(this);  // 把actvity放到application栈中管理setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);// 设置竖屏}@Overrideprotected void onDestroy() {super.onDestroy();if (mPresenter != null) mPresenter.onDestroy();}
}

通过继承baseactivity的处理我们的子activity就具备了mvp的功能了可能有疑惑的地方时Tutil是干什么用的下面是TUtil的代码

public class TUtil {public static <T> T getT(Object o, int i) {try {return ((Class<T>) ((ParameterizedType) (o.getClass().getGenericSuperclass())).getActualTypeArguments()[i]).newInstance();} catch (Exception e) {e.printStackTrace();return null;}}public static Class<?> forName(String className) {try {return Class.forName(className);} catch (ClassNotFoundException e) {e.printStackTrace();return null;}}
}

也就是通过TUtil 获取我们具体的presenter跟model实例
最后使我们的应用环节了

public class NewsListFragment extends BaseFragment<NewsListPresenter, NewsListModel> implements NewsListView, OnRefreshListener, OnLoadMoreListener {@Bind(R.id.irc)IRecyclerView irc;@Bind(R.id.loadedTip)LoadingTip loadedTip;private NewListAdapter newListAdapter;private List<NewsSummary> datas = new ArrayList<>();private String mNewsId;private String mNewsType;private int mStartPage = 0;//baseFragment处理-----------------------------------------------------------------------------------------------------@Overrideprotected int getLayoutResource() {return R.layout.framents_news;}@Overridepublic void initPresenter() {mPresenter.setVM(this, mModel);}@Overrideprotected void initView() {//----初始化过程presenter调用方法获取数据mPresenter.getNewsListDataRequest(mNewsType, mNewsId, mStartPage);}//view接口处理---------------------------------------------------------------------------------------------------------@Overridepublic void returnNewsListData(List<NewsSummary> newsSummaries) {//presenter回调的处理在activity中处理view的逻辑if (newsSummaries != null) {mStartPage += 20;if (newListAdapter.getPageBean().isRefresh()) {irc.setRefreshing(false);newListAdapter.replaceAll(newsSummaries);} else {if (newsSummaries.size() > 0) {irc.setLoadMoreStatus(LoadMoreFooterView.Status.GONE);newListAdapter.addAll(newsSummaries);} else {irc.setLoadMoreStatus(LoadMoreFooterView.Status.THE_END);}}}}@Overridepublic void scrolltoTop() {irc.smoothScrollToPosition(0);}@Overridepublic void showLoading(String title) {if (newListAdapter.getPageBean().isRefresh()) {loadedTip.setLoadingTip(LoadingTip.LoadStatus.loading);}}@Overridepublic void stopLoading() {loadedTip.setLoadingTip(LoadingTip.LoadStatus.finish);}@Overridepublic void showErrorTip(String msg) {if (newListAdapter.getPageBean().isRefresh()) {loadedTip.setLoadingTip(LoadingTip.LoadStatus.error);loadedTip.setTips(msg);irc.setRefreshing(false);} else {irc.setLoadMoreStatus(LoadMoreFooterView.Status.ERROR);}}//recycleView借口-----------------------------------------------------------------------------------------------------------------------------@Overridepublic void onLoadMore(View loadMoreView) {//---}@Overridepublic void onRefresh() {//---}
}

presenter的处理

public class NewsListPresenter extends BasePresenter<NewsListView, NewsListModel> {@Overridepublic void onStart() {super.onStart();//监听返回顶部动作mRxManage.on(FirstConstant.NEWS_LIST_TO_TOP, new Action1<Object>() {@Overridepublic void call(Object o) {mView.scrolltoTop();}});}/*** 请求获取列表数据*/public void getNewsListDataRequest(String type, String id, int startPage) {mRxManage.add(mModel.getNewsListData(type, id, startPage).subscribe(new RxSubscriber<List<NewsSummary>>(mContext, false) {@Overridepublic void onStart() {super.onStart();mView.showLoading("请稍后...");}@Overrideprotected void _onNext(List<NewsSummary> newsSummaries) {mView.returnNewsListData(newsSummaries);mView.stopLoading();}@Overrideprotected void _onError(String message) {mView.showErrorTip(message);}}));}
}

到这里就介绍完了mvp了其实看完了这篇博客可能你还是有些蒙按照我的基础类创建自己的activity练几次然后你就找到mvp的规律了。

MVP从入门到...相关推荐

  1. MVP小白入门,只需5步

    前言:因为公司氛围没有用,一直很火的mvp模式像鬼一样听说过没见过,今天闲来无事了解一下,发现由普通的MVC改起来还是挺行云流水的,但像有些弹窗不知道写在P层还是V层 关于MVP的概念我就不详细说了, ...

  2. Android开发目前为止记载最全的有关项目的网址

    网址大全 RxTools/README.md at master · vondear/RxTools · GitHub https://github.com/vondear/RxTools/blob/ ...

  3. Android开发以来所记载最全的有关项目的网址

    网址大全 RxTools/README.md at master · vondear/RxTools · GitHub https://github.com/vondear/RxTools/blob/ ...

  4. 前端在线(你一定要知道的前端网站)

    前端入门篇 1,React Native 混合开发,推荐大家看江清清的这一套文章,入门还是不成问题的 http://www.lcode.org/react-native/ 2,MVP框架的使用  都快 ...

  5. mvp关联activity生命周期_Android MVP架构从入门到精通-真枪实弹

    Android MVP架构从入门到精通-真枪实弹 一. 前言 你是否遇到过Activity/Fragment中成百上千行代码,完全无法维护,看着头疼? 你是否遇到过因后台接口还未写而你不能先写代码逻辑 ...

  6. Android MVP架构从入门到精通-真枪实弹

    Android MVP架构从入门到精通-真枪实弹 一. 前言 二. MVC架构 1. MVC架构优缺点 A. 缺点 B. 优点 三. MVP架构 1. MVP架构优缺点 A. 缺点 B. 优点 四. ...

  7. Android RxJava+Retrofit+MVP 入门总结

    前言 RxJava+Retrofit+MVP的使用已经推出一段时间了,也一直想找个时间学习一下并且应用到接下来的项目中.趁放假这段时间仔细研究了一下,确实相比于其他框架的学习成本要高一些,不过功能实现 ...

  8. Android MVC,MVP,MVVM模式入门——重构登陆注册功能

    一  MVC模式: M:model,业务逻辑 V:view,对应布局文件 C:Controllor,对应Activity 项目框架: 代码部分: layout文件(适用于MVC和MVP两个Demo): ...

  9. java mvp模式_MVP模式入门(结合Rxjava,Retrofit)

    本文MVP的sample实现效果: 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MVC的缺点.我们才知道为什么要用MVP. 关于MVC的图解,我在网上找到了一些图.如下: MVC模 ...

最新文章

  1. POJ1258 Agri-Net【最小生成树】
  2. hdu 1806线段树 区间合并
  3. linux mysql 停止,linux 里 重启 和停止 mysql的原理
  4. 在 WinCe 平台读写 ini 文件
  5. 【java】ASM代理方式 Byte-Buddy代理方式 Javassist代理方式
  6. 云计算教程学习入门视频课件:常用数据库排名
  7. .rpt文件内容读取java_python读取PDF指定表格内容批量文件重命名
  8. Delphi 之 定时器 (TTimer组件)
  9. 2021-08-21 mvc架构
  10. 个人投资者金融期货开户的条件
  11. R中安装rgl时“configure: error: missing required library GL”错误的解决方法
  12. 大数据可视化技术与应用作业一的经验总结
  13. 应用实例之__get()魔术方法--ShuipFCMS的组件(Components)调用原理
  14. android9自动安装权限9,按键精灵所有者读写权限安卓9.0如何获取?设置
  15. 低温工作笔记本计算机,电脑低温自动关机
  16. 关于网易2018实习生招聘的“道路布灯”问题
  17. 基于STM32F103RCT6实现串口中断发送,使用环形队列
  18. Scala-trait(特质)
  19. GDUT 排位赛2.19 G
  20. typeScript 技术胖 笔记 下

热门文章

  1. QQ、微信、新浪 利用refresh_token重新登录
  2. 1120_野火RT-Thread教程学习4_RTT学习基础知识梳理
  3. iOS在Xib加载自定义Xib视图
  4. 联想装win7驱动遇到问题的解决
  5. jpg转换pgm(其他图片格式转换类似)
  6. 腾讯云服务器入门使用指南教程 新手必看教程
  7. 爬虫第四战爬取糗事百科搞笑段子
  8. 计院生活--第一章 卧薪尝胆
  9. 这片太虐,抱歉,我退场了。
  10. codeforces 616F Expensive Strings