使用nohttp为了方便做了封装,网上找了一些资料,根据自己的需要修改融合了一下,首先在gradle中添加nohttp的依赖,接下来就是封装代码:
分为三部分,首先新建一个类CallServer,在其构造函数中创建一个请求队列requestqueen,再就是注意将callserver的实体类对象获取写成单例具体代码如下:
/**
* Created by gaowei on 2017/1/16.
*/
public class CallServer {
private static RequestQueue requestQueue;
private static CallServer callServer;
private CallServer(){
requestQueue = NoHttp.newRequestQueue();
}
public synchronized static CallServer getRequestInstance(){
if (callServer==null){
callServer = new CallServer();
}
return callServer;
}
/**
* 添加请求头参数,这个由用户根据需要添加,也可以不添加
* @param request
*/
public void addHeaders(Context context,Request request){
request.addHeader("MFIJI-UDID", PrefUtils.getString(context, GlobleContent.UDID,""));
request.addHeader("MFIJI-MODEL",PrefUtils.getString(context,GlobleContent.MODEL,""));
request.addHeader("MFIJI-OS-VERSION",PrefUtils.getString(context,GlobleContent.OSVERSION,""));
request.addHeader("MFIJI-APP-VERSION",PrefUtils.getString(context,GlobleContent.APPVERSION,""));
}
/**
* 将请求添加到队列
* @param what 标记请求
* @param request 请求对象
* @param callback 结果回调对象
* @param <T>
* @param loading 加载中进度布局
*/
public <T> void add(int what, Request<T> request, HttpListener callback,boolean isRefresh, View loading) {
requestQueue.add(what, request, new HttpResponseListener(request, callback,isRefresh,loading));
}
/**
* 取消这个sign标记的所有请求
*/
public void cancelBySign(Object sign) {
requestQueue.cancelBySign(sign);
}
/**
* 取消队列中所有请求
*/
public void cancelAll() {
requestQueue.cancelAll();
}
/**
* 退出app时停止所有请求
*/
public void stopAll() {
requestQueue.stop();
}
}
其中添加请求头部分根据需要自己添加,不需要就删掉。
再创建一个类实现OnResponseListener接口,实现四个方法,代码如下:
/**
* Created by gaowei on 2017/1/16.
*/
public class HttpResponseListener implements OnResponseListener {
/**
* 当前的 request
*/
private Request<?> mRequest;
/**
* 传进来的回调接口
*/
private HttpListener callback;
/**
* 传进来的加载中布局
*/
private View mLoading;
/**
* 判断是否是下拉刷新
*/
private boolean mIsRefresh;
/**
* @param loading 加载中进度布局
* @param isRefresh 判断是否是下拉刷新(如果下拉刷新有自带的加载中动画此时不需要自己写的loading)
* @param request 请求对象
* @param httpCallback 回调对象
*/
public HttpResponseListener( Request request, HttpListener httpCallback,boolean isRefresh, View loading) {
this.mRequest = request;
this.callback = httpCallback;
this.mLoading = loading;
this.mIsRefresh=isRefresh;
}
@Override
public void onStart(int i) {
if (mIsRefresh&&mLoading!=null){
mLoading.setVisibility(View.GONE);
}else if (mLoading!=null){
mLoading.setVisibility(View.VISIBLE);
}
}
@Override
public void onSucceed(int i, Response response) {
if (callback != null){
callback.onSucceed(i, response);
}
}
@Override
public void onFailed(int i, Response response) {
if (callback != null){
callback.onFailed(i,response);
}
}
@Override
public void onFinish(int i) {
if (mLoading!=null){
mLoading.setVisibility(View.GONE);
}
}
}
如上代码在HttpResponseListener的构造方法中传去一个接口HttpListener,那么第三部分就是这个接口的实现,其中有成功和失败两个方法等着去实现,如下:
/**
* Created by gaowei on 2017/1/16.
*/
public interface HttpListener {
/**
* success
*/
void onSucceed(int what, Response response);
/**
* faild
*/
void onFailed(int what, Response response);
}
此时封装就完成了,下面就是看看怎么使用了,
request = NoHttp.createStringRequest(url, RequestMethod.GET);
CallServer.getRequestInstance().addHeaders(this, request);//添加访问头
CallServer.getRequestInstance().add(5, request, new HttpListener() {
@Override
public void onSucceed(int what, Response response) {
String result = (String) response.get();
processData(result);//解析返回数据的方法
}
@Override
public void onFailed(int what, Response response) {
Toast.makeText(AddressActivity.this,"网络异常,请稍后重试",Toast.LENGTH_SHORT).show();
}
},false,flLoading);
我的代码里添加了访问头,不需要的就不用写,代码很简单相信大家都看得懂,就不多做解释了,注释也都很清楚。我最后一行false,意思是当前没有下拉刷新的需要,需要展示我自定义的flLoading的布局。