volley请求封装,大家帮我看看有什么缺点和改进?

public class ApiClient {

    /**
     * @param context
     *
     * @param requestQueue RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。
     *                     RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,
     *                     这是非常浪费资源的, 在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
     *
     * @param baseRequest
     *
     * @param apiClientCB
     *
     */
    public static void doRequest(final Context context, RequestQueue requestQueue, final BaseRequest baseRequest, final ApiClientCB apiClientCB) {

        if (baseRequest.getRequestMethod().equals(AppConfig.GET_METHOD)) {

            StringRequest request = new StringRequest(baseRequest.getCompleteUrl(baseRequest),

                    /** Callback interface for delivering parsed responses. */
                    new Response.Listener<String>() {

                        @Override
                        public void onResponse(String response) {

                            BaseResponse baseResponse = BaseResponse.parseBase(response);
                            LogUtil.showBaseResponse(context, baseResponse);

                            if (apiClientCB != null) {

                                apiClientCB.responseSuccess(response);

                                // 0 | 1 | >1
                                if (baseResponse.getCode().equals("0")) {
                                    apiClientCB.responseCode0(response);
                                } else if (baseResponse.getCode().equals("1")) {
                                    apiClientCB.responseCode1(response);
                                } else {
                                    apiClientCB.responseCodeMore1(response);
                                }
                            }

                        }
                    },

                    /** Callback interface for delivering error responses. */
                    new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            if (apiClientCB != null) {
                                apiClientCB.responseFailed(error.getMessage());
                            }
                        }
                    });

            // 执行HTTP get请求
            requestQueue.add(request);
        }

        if (baseRequest.getRequestMethod().equals(AppConfig.POST_METHOD)) {
            StringRequest request = new StringRequest(Method.POST, baseRequest.getCompleteUrl(baseRequest),

                    new Response.Listener<String>() {

                        @Override
                        public void onResponse(String response) {

                            BaseResponse baseResponse = BaseResponse.parseBase(response);
                            LogUtil.showBaseResponse(context, baseResponse);

                            if (apiClientCB != null) {

                                apiClientCB.responseSuccess(response);

                                // 0 | 1 | >1
                                if (baseResponse.getCode().equals("0")) {
                                    apiClientCB.responseCode0(response);
                                } else if (baseResponse.getCode().equals("1")) {
                                    apiClientCB.responseCode1(response);
                                } else {
                                    apiClientCB.responseCodeMore1(response);
                                }
                            }

                        }
                    },

                    new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            if (apiClientCB != null) {
                                apiClientCB.responseFailed(error.getMessage());
                            }
                        }

                    }) {

                /**
                 * 可是这只是指定了HTTP请求方式是POST,那么我们要提交给服务器的参数又该怎么设置呢?很遗憾,StringRequest中并没有提供设置POST参数的方法,
                 * 但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,
                 * 我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了
                 *
                 */
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
                    return baseRequest.getParameters();
                }
            };

            // 执行HTTP post请求
            requestQueue.add(request);
        }

    }

}
阅读 10k
2 个回答

简单的Get和Post封装。

好处:拿到的Response是String类型,数据格式灵活,方便调用端自行处理。
缺点:没有定制性的加入JsonBean的解析。(PS:JsonBean是本猫自己的叫法,意指Json对应的序列化Java简单对象)

BaseResponse猜测是题主自己定义的类。apiClientCB.responseCode0()不太明白用途。

而且本身Volley的默认Request类的content-type是表单类型,题主可以自己加入application/json和multipart/form-data,支持Json上传和文件上传(大文件慎用!!!

volley本身不适合文件的上传和下载,不过很小的的文件也可以支持。如果觉得不爽可以用别的库实现。

建议看看Github上Volley的扩展库:
https://github.com/DWorkS/VolleyPlus(活跃)
https://github.com/anton46/IceNet(封装可以借鉴,不活跃)

这也叫封装啊?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题