天天看点

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