天天看點

nohttp的封裝

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