版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lijia1201900857/article/details/79270524
最近在网上学习了一篇课程,讲的是通过代理模式对第三方框架进行封装。
感觉讲的很不错,受益良多,特此记录。
首先什么是代理模式?
代理模式就是:为其他对象提供一种代理,以控制对这个对象的访问。
举个例子:没空下去吃饭,找个同事帮忙买饭就是代理模式;平常租房子,
嫌麻烦,说出房子条件,让找中介帮忙找,也是一种代理模式。
了解了代理模式,接下来的代码就好理解了。
首先我们的使用场景:项目刚开始,使用的是Volley请求框架,基本需求
都能满足。后来,出现了更完美的OkHttp请求框架,老板想让你使用最新的框架。
如果你在代码里请求网络的时候,都是直接使用的Volley代码直接进行操作的,那
就需要把每一处的请求都改一遍,非常麻烦。
所以,接下来我们要解决这个问题,实现一行代码,切换网络请求框架!!!!
代码走起:
统一网络请求回调:
/**
* 接口统一回调
* */
public interface ICallBack {
//成功
void onSuccess(String result);
// 失败
void onFailed(String result);
}
代理接口
/**
* 代理接口
* 封装各种三方类库的共同方法
* */
public interface IHttpProcessor {
// http 协议的四种动作 get post put delete
void get(String url ,Map<String ,Object> params,ICallBack callBack);
void post(String url,Map<String ,Object> params,ICallBack callBack);
}
代理对象:类似于一个工具类,可以直接调用相关方法
/**
* 代理类
*/
public class HttpUtils implements IHttpProcessor {
private static IHttpProcessor httpProcessor;
private static HttpUtils httpUtils;
public HttpUtils() {
}
// 单例
public static HttpUtils getInstance() {
if (httpUtils == null) {
synchronized (HttpUtils.class) {
if (httpUtils == null)
httpUtils = new HttpUtils();
}
}
return httpUtils;
}
public static void init(IHttpProcessor processor) {
httpProcessor = processor;
}
@Override
public void get(String url, Map<String, Object> params, ICallBack callBack) {
httpProcessor.get(url, params, callBack);
}
@Override
public void post(String url, Map<String, Object> params, ICallBack callBack) {
httpProcessor.post(url, params, callBack);
}
}
首先,是Volley框架
public class VolleyProcessor implements IHttpProcessor {
private RequestQueue requestQueue;
public VolleyProcessor(Context context) {
requestQueue = Volley.newRequestQueue(context);
}
@Override
public void get(String url, Map<String, Object> params, final ICallBack callBack{
StringRequest request = new StringRequest(Request.Method.GET, url, new Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
callBack.onFailed(error.toString());
}
});
requestQueue.add(request);
}
@Override
public void post(String url, final Map<String, Object> params, final ICallBack callBack) {
StringRequest request = new StringRequest(url, new Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
callBack.onFailed(error.toString());
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//将Map<String, Object> 转为 <String, String>
Map<String, String> newMap = new HashMap<String, String>();
for (Map.Entry<String, Object> entry : params.entrySet()) {
newMap.put(entry.getKey(), (String) entry.getValue());
}
return newMap;
}
};
requestQueue.add(request);
}
}
然后是 Okhttp 框架
public class OkHttpProcessor implements IHttpProcessor {
private OkHttpClient client;
private Handler mHandler;// okhttp 返回结果在子线程中,通过handler 发送到主线程
public OkHttpProcessor() {
client = new OkHttpClient();
mHandler = new Handler();
}
@Override
public void get(String url, Map<String,Object> params, final ICallBack callBack) {
// TODO Auto-generated method stub
Request request = new Request.Builder().get().url(url)
// 不添加,访问中文网络的时候回出错
.header("User-Agent", "a").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call arg0, final Response arg1) throws IOException {
if (arg1.isSuccessful()) {
final String result = arg1.body().string();
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(result);
}
});
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(arg1.toString());
}
});
}
}
@Override
public void onFailure(Call arg0, final IOException arg1) {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(arg1.toString());
}
});
}
});
}
@Override
public void post(String url, Map<String, Object> params, final ICallBack callBack) {
Request request = new Request.Builder().post(appendyBody(params))
.url(url).header("User-Agent", "a")
.addHeader("", "a").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call arg0, final Response arg1) throws IOException {
if (arg1.isSuccessful()) {
final String result = arg1.body().toString();
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(result);
}
});
} else {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(arg1.toString());
}
});
}
}
@Override
public void onFailure(Call arg0, final IOException arg1) {
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(arg1.toString());
}
});
}
});
}
/**
* 拼接参数
*/
public RequestBody appendyBody(Map<String, Object> params) {
FormBody.Builder builder = new FormBody.Builder();
if (params == null || params.isEmpty()) {
return builder.build();
}
for (Map.Entry<String, Object> map : params.entrySet()) {
builder.add(map.getKey(), map.getValue().toString());
}
return builder.build();
}
}
到这里代码已经写完。接下来就是见证奇迹的时刻,一行代码修改网络框架。
自定义 MyApplication
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
//绑定委托对象
// HttpUtils.init(new OkHttpProcessor());
@Override
public void onCreate() {
super.onCreate();
//绑定委托对象
// HttpUtils.init(new OkHttpProcessor());
HttpUtils.init(new VolleyProcessor(this));
}
}
红色的标记,即可做到自如的切换网络请求框架。
如果想用OkHttp 即使用第一行,想用 Volley 使用第二行代码。
代码中使用: 例如 获取 天气信息
String url="http://www.weather.com.cn/data/cityinfo/101010100.html";
HttpUtils.getInstance().get(url, null, new ICallBack() {
@Override
public void onSuccess(String result) {
Log.d("log", "result=="+result);
}
@Override
public void onFailed(String result) {
HttpUtils.getInstance().get(url, null, new ICallBack() {
@Override
public void onSuccess(String result) {
Log.d("log", "result=="+result);
}
@Override
public void onFailed(String result) {
Log.d("log", "result=="+result);
}
});
}
});
如果还想使用其他的网络框架,写法跟 VolleyProcessor 、OkhttpProcessor 一样,
只需要 实现 IHttpProcessor 代理接口,然后在接口的方法中实现该框架的请求即可。