这里会沿用上篇文章的代码
Android MVP 构建一个简单的MVPhttps://blog.csdn.net/hongxue8888/article/details/100888697
参考:
免费开放接口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<String, Object> 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<Result> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> params) {
FormBody.Builder body = new FormBody.Builder();
if (params == null || params.isEmpty()) {
return body.build();
}
for (Map.Entry<String, Object> entry : params.entrySet()) {
body.add(entry.getKey(), entry.getValue().toString());
}
return body.build();
}
@Override
public void post(String url, Map<String, Object> 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<String, Object> params, final ICallback callback) {
StringRequest stringRequest = new StringRequest(
Request.Method.POST,
url,
new Response.Listener<String>() {
@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<String,Object> params=new HashMap<>();
params.put("type","1");
params.put("page","1");
HttpHelper.obtain().post(url, params, new HttpCallback<DuanziRootBean>() {
@Override
public void onSuccess(DuanziRootBean bean) {
Log.i("hongxue resultcode = ",bean.getCode() + "");
}
});
代码Github:https://github.com/345166018/AndroidMVP/tree/master/HxMVP2