MVP(Model ViewPresenter)模式是著名的MVC(Model ViewController)模式的一个演化版本,目前它在Android应用开发中越来越重要了。初看起来我们会感觉增加了很多类接口代码看起来更加清晰。
请参考百度百科的MVP设计模式的讲解
/** * @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 { @Override public void onStart() { } @Override public void ondoinBack() { } }
/** * @ClassName: LoginApiImpl * @Description: 实现 LoginApi,所有的login模块的业务逻辑都在此处,所以Activity界面无需任何复杂逻辑,MVP模式的核心逻辑 * @author libiao * @date 2015 -11 -6 下午3:22:15 * */ public class LoginApiImpl implements LoginApi{ @Override public 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(); } @Override public 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; } @Override protected void onPreExecute(Context target) { // TODO Auto-generated method stub super.onPreExecute(target); api.onStart(); } @Override protected ResponseBO doInBackground(Context target, Void... params) { api.ondoinBack(); return HttpUtil. getInstance().post(json, url); } @Override protected 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 block e.printStackTrace(); } connection.disconnect(); return bo; } private HttpURLConnection getConnection(String path) { HttpURLConnection connection = null; // 初始化connection try { // 根据地址创建URL对象 URL url = new URL(path); // 根据URL对象打开链接 connection = (HttpURLConnection) url.openConnection(); // 设置请求的方式 connection.setRequestMethod( REQUEST_MOTHOD); // 发送POST请求必须设置允许输入,默认为true connection.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() { @Override public void onSuccess(ResponseBO response) { Toast. makeText(MainActivity.this, response.getResPonseCode() + ">>>>" + response.getResPonseMsg(), Toast.LENGTH_LONG) .show(); } });
Eclipse项目地址:http://download.csdn.net/detail/q908555281/9247833
Android Studio项目地址:https://github.com/townkoim/Mvp