探寻Android中MVP设计模式
2016-05-21 19:26
537 查看
Android中mvp现在炙手可热的设计模式之一,在讲解mvp模式之前我们先看看图。
此图是我从泡网上拔下来的,如果不可以这么做请联系我,我会删除的, 谢谢。
MVP是MVC升级来的, 如果有对MVC不了解的同学请自行百度, 我在这儿就说下MVC的缺点, android其实并没有标准的mvc模式, 而我们习惯性的把Activity当作Controller去使用, 而且在MVC中是允许M层和V层有交互的, 然而我们把一些逻辑写到controller中会使activitry或者fragment中代码巨多, 增加了代码的维护性,没准下一个开发者去维护代码是都要崩溃了
下面我们进入今天的主题———->MVP
在MVP中, 每个字母都代表着什么?因为它是从MVC升级而来, 所以除了P其余都相同
M:Module层, 也就是我们平常写的模型(JavaBean), 业务逻辑也是在这儿。
V:View层, Activity, 自定义的View等等
P:Presenter层,相当于中间人的角色,module去和view进行交互都是通过presenter
这样mvp三层已经介绍完了,当然它的优缺点也有很多,我就不在这儿一一列举的, 我们今天主要是学如何使用mvp。当然, 我们要以代码的形式体现,这次的代码就是简单的点击按钮展示json数据, url和以前我讲volley的一样, 都是获取经纬度,返回json数据,而网络请求用的是volley。volley是google在2013年推出的网络请求框架,有不懂得同学可以去看我的另一篇博客.
下面我们首先来展示的就是Module层
在下手之前我们要思考一下我们展示数据都需要什么, 首先展示数据是一个动作,所以我们定义一个接口showData, 然后里面写一个方法load, 它需要什么参数呢?我们展示数据其实就是请求网络接口,然后把它给我们返回的数据展示出来。所以我们需要一个url和一个加载数据的监听(接口)。
上文已经说过, 我是用的是volley+gson封装,返回的就是一个javabean, 所以很是方便。我们从代码中可以看到在监听成功的接口中是有参数的,为什么呢?继续往下看
下面我们展示view层。
首先xml代码很是简单
在加载数据的时候需要设置url, 然后加载成功了会做什么,加载失败或做什么,所以我定义了接口中有三个方法
最后我们展示的是Prenenter层放出代码
我们创建了先前的两个接口的实例,然后再构造器中初始化, 然后写一个load方法来供module和view层进行数据交互。
到此为止, mvp版的展示数据就已经写完了,有的同学就说了,好麻烦啊, 仅仅是一个展示数据就写如此多的接口,
对,兄弟,你说对了,就是比较麻烦,但是总比一个类上千行爽吧?这样层次分明,但是写起来要费一些时间,如果你有充分的时间和人力,并且提高代码的可维护性,mvp模式确实是挺好的选择,另外推荐下retrofit2+rxjava+mvp会让你一直高潮的,有兴趣的同学了解下吧。
此图是我从泡网上拔下来的,如果不可以这么做请联系我,我会删除的, 谢谢。
MVP是MVC升级来的, 如果有对MVC不了解的同学请自行百度, 我在这儿就说下MVC的缺点, android其实并没有标准的mvc模式, 而我们习惯性的把Activity当作Controller去使用, 而且在MVC中是允许M层和V层有交互的, 然而我们把一些逻辑写到controller中会使activitry或者fragment中代码巨多, 增加了代码的维护性,没准下一个开发者去维护代码是都要崩溃了
下面我们进入今天的主题———->MVP
在MVP中, 每个字母都代表着什么?因为它是从MVC升级而来, 所以除了P其余都相同
M:Module层, 也就是我们平常写的模型(JavaBean), 业务逻辑也是在这儿。
V:View层, Activity, 自定义的View等等
P:Presenter层,相当于中间人的角色,module去和view进行交互都是通过presenter
这样mvp三层已经介绍完了,当然它的优缺点也有很多,我就不在这儿一一列举的, 我们今天主要是学如何使用mvp。当然, 我们要以代码的形式体现,这次的代码就是简单的点击按钮展示json数据, url和以前我讲volley的一样, 都是获取经纬度,返回json数据,而网络请求用的是volley。volley是google在2013年推出的网络请求框架,有不懂得同学可以去看我的另一篇博客.
下面我们首先来展示的就是Module层
在下手之前我们要思考一下我们展示数据都需要什么, 首先展示数据是一个动作,所以我们定义一个接口showData, 然后里面写一个方法load, 它需要什么参数呢?我们展示数据其实就是请求网络接口,然后把它给我们返回的数据展示出来。所以我们需要一个url和一个加载数据的监听(接口)。
public interface ILoadListener { void loadSuccess(Data data); void loadError(); }
public interface IShowData { Data load(String url, ILoadListener listener); }
public class LoadData implements IShowData{ private Data data; @Override public Data load(String url, final ILoadListener listener) { HttpLoader.get(url, Data.class, 200, new ResponseListener() { @Override public void onGetResponseSuccess(int requestCode, RBResponse response) { data = (Data) response; listener.loadSuccess(data); } @Override public void onGetResponseError(int requestCode, VolleyError error) { listener.loadError(); } }, true); return data; } }
上文已经说过, 我是用的是volley+gson封装,返回的就是一个javabean, 所以很是方便。我们从代码中可以看到在监听成功的接口中是有参数的,为什么呢?继续往下看
下面我们展示view层。
首先xml代码很是简单
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="startLoad" android:text="load"/> <TextView android:id="@+id/tv_show_load_data" android:layout_width="match_parent" android:layout_height="match_parent" android:text="waiting for load data ."/> </LinearLayout>
在加载数据的时候需要设置url, 然后加载成功了会做什么,加载失败或做什么,所以我定义了接口中有三个方法
public interface ILoadData { String getUrl(); void successFor(Data data); void errorFor(); }
public class LoadDataActivity extends AppCompatActivity implements ILoadData{ private String url = "http://gc.ditu.aliyun.com/geocoding?a=苏州市"; private TextView tv_show_load_data; private LoadPresenter loadPresenter = new LoadPresenter(this); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_load); initView(); } public void initView(){ tv_show_load_data = (TextView) findViewById(R.id.tv_show_load_data); } public void startLoad(View view){ loadPresenter.startLoad(); } @Override public String getUrl() { return url; } @Override public void successFor(Data data) { tv_show_load_data.setText(data+""); } @Override public void errorFor() { tv_show_load_data.setText("load error ."); } }
最后我们展示的是Prenenter层放出代码
public class LoadPresenter { private IShowData showData; private ILoadData loadData; public LoadPresenter(ILoadData loadData){ this.loadData = loadData; showData = new LoadData(); } public void startLoad(){ showData.load(loadData.getUrl(), new ILoadListener() { @Override public void loadSuccess(Data data) { loadData.successFor(data); } @Override public void loadError() { loadData.errorFor(); } }); } }
我们创建了先前的两个接口的实例,然后再构造器中初始化, 然后写一个load方法来供module和view层进行数据交互。
到此为止, mvp版的展示数据就已经写完了,有的同学就说了,好麻烦啊, 仅仅是一个展示数据就写如此多的接口,
对,兄弟,你说对了,就是比较麻烦,但是总比一个类上千行爽吧?这样层次分明,但是写起来要费一些时间,如果你有充分的时间和人力,并且提高代码的可维护性,mvp模式确实是挺好的选择,另外推荐下retrofit2+rxjava+mvp会让你一直高潮的,有兴趣的同学了解下吧。
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件