MVP 简单的例子
来源:互联网 发布:午夜凶铃 知乎 编辑:程序博客网 时间:2024/05/19 03:24
首先提一下MVP模式是什么 :MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
MVP和MVC的区别
作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。
在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,即View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
虽然 MVC 中的 View 的确“可以”访问 Model,但是我们不建议在 View 中依赖 Model,而是要求尽可能把所有业务逻辑都放在 Controller 中处理,而 View 只和 Controller 交互。
Demo
//View 接口public interface NewsView { void showProgress(); void addNews(List<NewsBean> newsList); void hideProgress(); void showLoadFailMsg();}
//Model 接口public interface NewsModel { void loadNews(String url, int type,OnLoadNewsListListener listener); }
// Presenter 接口public interface NewsPresenter { void loadNews(int type, int page);}
//Model的实现类就是 实现业务逻辑public class NewsModelImpl implements NewsModel { /** * 加载新闻列表 * @param url * @param listener */ @Override public void loadNews(String url, final int type, final OnLoadNewsListListener listener) { OkHttpUtils.ResultCallback<String> loadNewsCallback = new OkHttpUtils.ResultCallback<String>() { @Override public void onSuccess(String response) { List<NewsBean> newsBeanList = NewsJsonUtils.readJsonNewsBeans(response, getID(type)); listener.onSuccess(newsBeanList); } @Override public void onFailure(Exception e) { listener.onFailure("load news list failure.", e); } }; OkHttpUtils.get(url, loadNewsCallback); }
//这个是连接 Model和 view关键 public class NewsPresenterImpl implements NewsPresenter, OnLoadNewsListListener , SwipeRefreshLayout.OnRefreshListener{ private static final String TAG = "NewsPresenterImpl"; private NewsView mNewsView; private NewsModel mNewsModel; public NewsPresenterImpl(NewsView newsView) { this.mNewsView = newsView; this.mNewsModel = new NewsModelImpl(); } @Override public void loadNews(final int type, final int pageIndex) { String url = getUrl(type, pageIndex); LogUtils.d(TAG, url); //只有第一页的或者刷新的时候才显示刷新进度条 if(pageIndex == 0) { mNewsView.showProgress(); } mNewsModel.loadNews(url, type, this); } @Override public void onSuccess(List<NewsBean> list) { mNewsView.hideProgress(); mNewsView.addNews(list); } @Override public void onFailure(String msg, Exception e) { mNewsView.hideProgress(); mNewsView.showLoadFailMsg(); }}
//最后在 Activity 或者Fragment中 完成调用 。public class NewsListFragment extends Fragment implements NewsView{ private NewsPresenter mNewsPresenter; //(1) .... .... @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mNewsPresenter = new NewsPresenterImpl(this); //(2) mType = getArguments().getInt("type"); } @Override public void showProgress() { mSwipeRefreshWidget.setRefreshing(true); } @Override public void addNews(List<NewsBean> newsList) { mAdapter.isShowFooter(true); if(mData == null) { mData = new ArrayList<NewsBean>(); } mData.addAll(newsList); if(pageIndex == 0) { mAdapter.setmDate(mData); } else { //如果没有更多数据了,则隐藏footer布局 if(newsList == null || newsList.size() == 0) { mAdapter.isShowFooter(false); } mAdapter.notifyDataSetChanged(); } pageIndex += Urls.PAZE_SIZE; } @Override public void hideProgress() { mSwipeRefreshWidget.setRefreshing(false); } @Override public void showLoadFailMsg() { if(pageIndex == 0) { mAdapter.isShowFooter(false); mAdapter.notifyDataSetChanged(); } View view = getActivity() == null ? mRecyclerView.getRootView() : getActivity().findViewById(R.id.drawer_layout); Snackbar.make(view, getString(R.string.load_fail), Snackbar.LENGTH_SHORT).show(); } @Override public void onRefresh() { pageIndex = 0; if(mData != null) { mData.clear(); } mNewsPresenter.loadNews(mType, pageIndex);//(3) } ...}
代码不是完整项目,小白练手用的 大神勿笑。
源码地址 : https://github.com/WierZheng/EasyTime
1 0
- MVP 简单的例子
- Android MVP 架构最简单的例子!
- 一个简单的MVP小例子
- MVP&Retrofit&Rxjava&Gson的简单例子
- 一个简单可复用的MVP+RxJava+Retrofit例子
- Android MVP模式简单例子实战
- Android MVP模式简单例子实战
- Android MVP模式简单例子实战
- MVP模式分析及简单例子
- 一个登录的MVP例子
- MVP的简单理解
- MVP的简单理解
- MVP的简单实例
- MVP的简单使用
- MVP的简单介绍
- MVP的简单登录
- MVP的简单登录
- MVP的简单使用
- 02-软件开发计划
- Hibernate权限
- EXCEL基础视频-制作表格的小技巧
- Find All Numbers Disappeared in an Array
- Linux安装Tomcat
- MVP 简单的例子
- 96. Unique Binary Search Trees
- cdn测试
- android设计模式-Builder模式
- virt-manager新建虚拟机时提示vmport is not available with this qemu binary
- Android图形系统之Surface、SurfaceView、SurfaceHolder及SurfaceHolder.Callback之间的联系
- echarts图表插件的使用
- 容器类的用法
- -bin-sh-m-bad-interpreter-no-such-file-or-directory