Android中MVP设计模式实例
2015-11-06 15:52
671 查看
MVP(Model ViewPresenter)模式是著名的MVC(Model ViewController)模式的一个演化版本,目前它在Android应用开发中越来越重要了。初看起来我们会感觉增加了很多类接口代码看起来更加清晰。请参考百度百科的MVP设计模式的讲解MVP设计模式的核心思想:针对接口编程,而不是针对实现编程个人认为MVP模式比较适合中小型的项目。如果项目过大,可以采用模块化接口编程。就是将接口 根据自己业务需求分为 几个大的接口模块,然后再分别来实现小的模块。具体来看看实际应用做一个登录的小demo:先来看一下目录
根据代码来讲解这个流程 1、定义两个实体类,ResponseBO 这个实体类里面包含 code,和msg两个字段,用来存储服务器放回的responsecode和message。 UserBO-用户实体类 2、定义两个接口。 一个是实时跟踪AsyncTask的每个过程的接口。 一个是Login的接口
/** * @ClassName: ResponseApi * @Description: 异步任务的回调接口类,相当于 Asynctask中的三个方法 * @author libiao * @date 2015 -11 -6 下午3:04:22 * */ public interface ResponseApi { /** * @Title: onStart * @Description: 异步任务启动的时候。相当于AsyncTask中的 onstart()方法 * @return: void */ public void onStart(); /** * @Title: ondoinBack * @Description: 异步任务执行过程中。相当于AsyncTask中的doInBackground()方法 * @return: void */ public void ondoinBack(); /** * @Title: onSuccess * @Description: 异步任务执行完毕的方法,相当于AsyncTask中的onPostExecute()方法,实现此接口。这个方法们无论服务器返回的状态吗是多少,都会进入此方法 * @param response * @return: void */ public void onSuccess(ResponseBO response); } /** * @ClassName: LoginApi * @Description: * 登录的接口,如果项目比较大,可以采用模块化命名,在这个接口下,可以有当前模块的所有需要与服务器交互的方法(根据 api接口文档来封装 * ) ,比如我接口下面就一个登陆的方法,一个注册的方法(注册的方法的具体逻辑没有实现) * @author libiao * @date 2015 -11 -6 下午3:12:14 * */ public interface LoginApi { /** * @Title: login * @Description: 登陆的方法 * @param activity activity对象 * @param name 用户名 * @param password 密码 * @param api 回调接口 * @return: void */ public void login(Activity activity, String name, String password, ResponseApi api); public void regist(Activity activity, String phone, String auCode, String password, ResponseApi api); }3、为两个接口提供实现的方法,首先看一下ResponseApiImpl,为什么要定义这个抽象类来实现ResponseApi接口呢? 因为如果实现ResponseApi接口,其中的每个方法就必须要实现, 有些方法是我们可能不需要的,比如:ondoinBack()方法。所以在接口实例化的时候,是实例化ResponseApiImpl这个类,而不是实例化ResponseApi。import com.example.mvp.service.ResponseApi;/*** @ClassName: ResponseApiImpl* @Description: 实现了 ResponseApi接口,在调用ResponseApi接口的时候,实例化此类,可以不用必须实现onStart(),ondoinBack()方法* @author libiao* @date 2015-11-6 下午3:21:04**/public abstract class ResponseApiImpl implements ResponseApi {@Overridepublic void onStart() {}@Overridepublic void ondoinBack() {}}接着来看一看LoginApiImpl实现类,这里是主要的业务逻辑!
/*** @ClassName: LoginApiImpl* @Description: 实现 LoginApi,所有的login模块的业务逻辑都在此处,所以Activity界面无需任何复杂逻辑,MVP模式的核心逻辑* @author libiao* @date 2015 -11 -6 下午3:22:15**/public class LoginApiImpl implements LoginApi{@Overridepublic void login(Activity activity, String name, String password, ResponseApi api) {//在这里你可以对传进来的数据进行校验,如果校验失败则可以作出相应的处理,我这里只是弹出提示if(name== null|| "".equals(name)){Toast. makeText(activity, "用户名不能为空", Toast.LENGTH_SHORT).show();return;}if(password== null|| "".equals(password)){Toast. makeText(activity, "密码不能为空", Toast.LENGTH_SHORT).show();return;}JSONObject json = new JSONObject();try {json.put( "username", name);json.put( "password", password);} catch (JSONException e) {e.printStackTrace();}new MsgAsyncTask(activity, json.toString(), api, APPConstants.URL_LOGIN).execute();}@Overridepublic void regist(Activity activity, String phone, String auCode, String password, ResponseApi api) {}}<span style="color:#ff0000;"></span>最后来看一异步任务类吧,这里主要是执行与服务器的交互
/**** @ClassName: MsgAsyncTask* @Description: 发送普通字符串给服务器的异步任务* @author libiao* @date 2015 -11 -6 下午2:37:26**/public class MsgAsyncTask extends WeakAsyncTask<Void, Void, ResponseBO, Context>{private String json;private ResponseApi api;private String url;/*** @Title:MsgAsyncTask* @Description:构造方法* @param activity Activiyt对象* @param json 要发送给服务器端的字符串* @param api 回调接口* @param url 服务器地址*/public MsgAsyncTask(Activity activity,String json,ResponseApi api,String url) {super(activity);this. json=json;this. api=api;this. url=url;}@Overrideprotected void onPreExecute(Context target) {// TODO Auto-generated method stubsuper.onPreExecute(target);api.onStart();}@Overrideprotected ResponseBO doInBackground(Context target, Void... params) {api.ondoinBack();return HttpUtil. getInstance().post(json, url);}@Overrideprotected void onPostExecute(Context target, ResponseBO result) {super.onPostExecute(target, result);api.onSuccess(result);}}HttpUtil类:public class HttpUtil {private final static String REQUEST_MOTHOD = "POST";private final static int TIME_OUT = 15000;private static HttpUtil instance = null;private HttpUtil() {}public static HttpUtil getInstance() {if ( instance == null) {instance = new HttpUtil();}return instance;}public ResponseBO post(String json, String url) {ResponseBO bo = new ResponseBO();HttpURLConnection connection = getConnection(url);try {connection.setRequestProperty( "Content-Length", String.valueOf(json.getBytes().length));OutputStream os = connection.getOutputStream();os.write(json.getBytes( "UTF-8"));os.flush();int code = connection.getResponseCode();bo.setResPonseCode(code);if (connection.getResponseCode() == 200) {// 获取响应的输入流对象InputStream is = connection.getInputStream();// 创建字节输出流对象ByteArrayOutputStream baos = new ByteArrayOutputStream();// 定义读取的长度int len = 0;// 定义缓冲区byte buffer[] = new byte[1024];// 按照缓冲区的大小,循环读取while ((len = is.read(buffer)) != -1) {// 根据读取的长度写入到 os对象中baos.write(buffer, 0, len);}// 释放资源is.close();baos.close();bo.setResPonseMsg( new String(baos.toByteArray()));}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}connection.disconnect();return bo;}private HttpURLConnection getConnection(String path) {HttpURLConnection connection = null;// 初始化connectiontry {// 根据地址创建URL对象URL url = new URL(path);// 根据URL对象打开链接connection = (HttpURLConnection) url.openConnection();// 设置请求的方式connection.setRequestMethod( REQUEST_MOTHOD);// 发送POST请求必须设置允许输入,默认为trueconnection.setDoInput( true);// 发送POST请求必须设置允许输出connection.setDoOutput( true);// 设置不使用缓存connection.setUseCaches( false);// 设置请求的超时时间connection.setReadTimeout( TIME_OUT);connection.setConnectTimeout( TIME_OUT);connection.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded" );} catch (IOException e) {e.printStackTrace();}return connection;}}最后来看一下如何调用:
String name = edtName.getText().toString(); //得到用户名String password = edtPassword.getText().toString(); //得到密码// 实例化接口,MVP的核心思想就是针对接口编程而不是针对实现编程LoginApi api = new LoginApiImpl();// 调用接口请求服务器数据,服务器返回的数据回调在ResponseApiImpl的onSuccess()方法里面,可以根据自己的需求来实现onStart()和ondoinBack()方法api.login(MainActivity. this, name, password, new ResponseApiImpl() {@Overridepublic void onSuccess(ResponseBO response) {Toast. makeText(MainActivity.this, response.getResPonseCode() + ">>>>" + response.getResPonseMsg(), Toast.LENGTH_LONG) .show();}});Eclipse项目地址:http://download.csdn.net/detail/q908555281/9247833Android Studio项目地址:https://github.com/townkoim/Mvp
相关文章推荐
- 使用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的关闭事件
- SourceProvider.getJniDirectories