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