Android(安卓)MVP 一行代码轻松解决框架替换
这里会沿用上篇文章的代码
Android MVP 构建一个简单的MVPhttps://blog.csdn.net/hongxue8888/article/details/100888697
文章目录
- 1. 房产公司
- 2. 代理类(业务员)
- 3. 业主
- 3.1 业主1-OkHttpProcessor
- 3.2 业主2-VolleyProcessor
- 4. 客户(App)
参考:
免费开放接口API
https://www.jianshu.com/p/e6f072839282
Android MVP 构建一个简单的MVP
https://blog.csdn.net/hongxue8888/article/details/100888697
代码Github:https://github.com/345166018/AndroidMVP/tree/master/HxMVP2
在App版本迭代中,有可能会跟换框架,比如网络框架可能会从volley替换为okhttp或者retrofit,或者图片加载框架从ImageLoader替换为Glide,那在我们如何在项目中使用一行代码来完成框架的替换?
简单的思路:添加一个隔离层,帮App选择需要的框架,并提供相应的接口。App使用隔离层提供的接口即可。
具体实现就是通过: 注解 + 动态代理
动态代理类图如下所示:
客户想买房,并不会直接找业主买房,而是通过房产公司。房产公司会有一些业务员,业务员会查看公司登记了哪些在卖的房子。而这些在卖的房子真正是属于这些业主的。房产公司具备卖房的能力,而真正进行卖房动作的是业务员,业务员会持有业主的一个引用,卖房的过程由业务员和业主进行交互。
App可以理解为客户;房产公司和业务员可以理解为隔离层;volley、okhttp、retrofit等框架可以理解为业主。
retrofit和rxjava后面讲解
新建Android Library 名为 isolation_processor
添加依赖:
implementation 'com.android.volley:volley:1.1.0'implementation 'com.google.code.gson:gson:2.2.4'implementation 'com.squareup.okhttp3:okhttp:3.4.1'implementation 'org.xutils:xutils:3.3.36'
新建IHttpProcessor接口,相当于房产公司,里面可以定义各种网络操作的方法,如post、get等。
1. 房产公司
/** * 房产公司 */public interface IHttpProcessor { /** * 网络操作 get post del update put select....... */ void post(String url, Map params, ICallback callback);}
新建一个顶层回调接口ICallback,
/** * 顶层回调接口(json,xml,....) * */public interface ICallback { void onSuccess(String result); void onFailure(String e);}
ICallback中的onSuccess返回的是String类型,如果想直接返回一个json转换后的对象,我可以定义一个HttpCallback实现ICallback接口,然后将json字符串转换为我们需要的对象。
/** * 回调接口的json版本的实现类 * 用于把网络返回的json字符串转让换成对象(Result就是用户接收数据的类型) * //ResponceData就是Result */public abstract class HttpCallback implements ICallback { @Override public void onSuccess(String result) {//result就是网络回来的数据 //result把转换成用户需要的对象 Gson gson=new Gson(); //需要得到用户输入的对象对应的字节码是什么样的 //得到用户接收数据的对象对应的class Class<?> clz=analysisClassInfo(this); Result objResult=(Result)gson.fromJson(result,clz); //把已经转好的对象,交给用户 onSuccess(objResult); } public abstract void onSuccess(Result result); private Class<?> analysisClassInfo(Object object) { //getGenericSuperclass可以得到包含原始类型,参数化类型,数组,类型变量,基本数据 Type genType=object.getClass().getGenericSuperclass(); //获取参数化类型 Type[] params=((ParameterizedType)genType).getActualTypeArguments(); return (Class<?>)params[0]; } @Override public void onFailure(String e) { }}
2. 代理类(业务员)
/** * 代理类(业务员) */public class HttpHelper implements IHttpProcessor { //单例 private static HttpHelper instance; public static HttpHelper obtain() { synchronized (HttpHelper.class) { if (instance == null) { instance = new HttpHelper(); } } return instance; } private HttpHelper() { } private static IHttpProcessor mIHttpProcessor; //定义一个API,用来设置代码的接口(业务员找到一个对应的有房的人) public static void init(IHttpProcessor iHttpProcessor) { mIHttpProcessor = iHttpProcessor; } @Override public void post(String url, Map params, ICallback callback) { //http://www.aaa.bbb/index //user=hongxue&pwd=123 //http://www.aaa.bbb/index?&user=hongxue&pwd=123 String finalUrl = appendParams(url, params); mIHttpProcessor.post(finalUrl, params, callback); } public static String appendParams(String url, Map params) { if (params == null || params.isEmpty()) { return url; } StringBuilder urlBuilder = new StringBuilder(url); if (urlBuilder.indexOf("?") <= 0) { urlBuilder.append("?"); } else { if (!urlBuilder.toString().endsWith("?")) { urlBuilder.append("&"); } } for (Map.Entry entry : params.entrySet()) { urlBuilder.append("&" + entry.getKey()) .append("=") .append(encode(entry.getValue().toString())); } return urlBuilder.toString(); } private static String encode(String str) { try { return URLEncoder.encode(str, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); throw new RuntimeException(); } }}
3. 业主
3.1 业主1-OkHttpProcessor
public class OkHttpProcessor implements IHttpProcessor { private OkHttpClient mOkHttpClient; private Handler myHandler; public OkHttpProcessor() { mOkHttpClient = new OkHttpClient(); myHandler = new Handler(); } private RequestBody appendBody(Map params) { FormBody.Builder body = new FormBody.Builder(); if (params == null || params.isEmpty()) { return body.build(); } for (Map.Entry entry : params.entrySet()) { body.add(entry.getKey(), entry.getValue().toString()); } return body.build(); } @Override public void post(String url, Map params, final ICallback callback) { RequestBody requestBody = appendBody(params); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); mOkHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { final String result = response.body().string(); if (response.isSuccessful()) { myHandler.post(new Runnable() { @Override public void run() { callback.onSuccess(result); } }); } } }); }}
3.2 业主2-VolleyProcessor
public class VolleyProcessor implements IHttpProcessor { private static RequestQueue mQueue = null; public VolleyProcessor(Context context) { mQueue = Volley.newRequestQueue(context); } @Override public void post(String url, Map params, final ICallback callback) { StringRequest stringRequest = new StringRequest( Request.Method.POST, url, new Response.Listener() { @Override public void onResponse(String response) { callback.onSuccess(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } } ); mQueue.add(stringRequest); }}
4. 客户(App)
public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //进行框架的选择// HttpHelper.init(new VolleyProcessor(this)); HttpHelper.init(new OkHttpProcessor());// HttpHelper.init(new XUtilsProcessor(this));// HttpHelper.init(new RetrofitProcessor()); }}
String url="https://www.apiopen.top/satinApi"; HashMap params=new HashMap<>(); params.put("type","1"); params.put("page","1"); HttpHelper.obtain().post(url, params, new HttpCallback() { @Override public void onSuccess(DuanziRootBean bean) { Log.i("hongxue resultcode = ",bean.getCode() + ""); } });
代码Github:https://github.com/345166018/AndroidMVP/tree/master/HxMVP2
更多相关文章
- android驱动学习---led实验
- RestHttp
- Android用户手势检测
- Android(安卓)aidl接口远程调用
- Parcelable
- Android(安卓)Parcelable
- Android类库介绍
- Android(安卓)LCD(三):Samsung LCD接口篇
- [读书笔记]intent.putExtra的使用与原理分析