通过代理模式,对第三方网络请求框架进行封装,实现任意切换网络框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
 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) {
 Log.d("log", "result=="+result);
 }
});
 
如果还想使用其他的网络框架,写法跟 VolleyProcessor  、OkhttpProcessor 一样, 只需要 实现 IHttpProcessor 代理接口,然后在接口的方法中实现该框架的请求即可。




猜你喜欢

转载自blog.csdn.net/lijia1201900857/article/details/79270524