使用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的布局。