`
砺雪凝霜
  • 浏览: 156502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

android网络请求框架Volley(二)

阅读更多

    上一篇博客(http://1029457926.iteye.com/blog/2203653)详细的讲了Volley的原理及用法,在实际开发中可能并不那么实用,下面来总结我们项目中是如何封装使用的。

 1  Volley是用来请求网络数据的,首先我们要准备好要传递的URL参数

 

 HashMap<String, String> params = new HashMap<String, String>();
        params.put("user_id", userId);
        params.put("count", count + "");
        params.put("since_time", timeSince);
        params.put("profile_user_id", profileUserId);
        String url = HttpConstant.DOMAIN_NORMAL + HttpConstant.FRIENDS_FANS_1;

 

2 把URL拼凑成一个完整的链接

 

 

 

public void get(String url, Map<String, String> data, String tag, final CallbackLightRequest<LightResponse> callback) {
        if (!ConfigRequests.isNetworkOkWithAlert(mContext)) {
            callNetworkError(tag, url, data, callback);
            return;
        }
        Map<String, String> defaultParams = ConfigRequests.getInstance().getDefaultParams();
        if (defaultParams != null && defaultParams.size() > 0) {
            data.putAll(defaultParams);
        }
        if (data != null && data.size() > 0) {
            url = url + "?" + RequestUtils.map2QueryString(data);
        }
        this._get(url, tag, callback);
    }

    拼凑URl的方法:map2QueryString

public class RequestUtils {
    /**
     * 生成QueryString,以 a=1&b=2形式返回
     */
    public static String map2QueryString(Map<String, String> map) {
        StringBuilder sb = new StringBuilder();
        String value;
        try {
            if (map != null && map.size() > 0) {
                for (Entry<String, String> entry : map.entrySet()) {
                    value = "";
                    value = entry.getValue();
                    if (StringUtils.isEmpty(value)) {
                        value = "";
                    } else {
                        value = URLEncoder.encode(value, Models.Encoding.UTF8);
                    }
                    sb.append(entry.getKey()).append("=").append(value)
                            .append("&");
                }
                sb.deleteCharAt(sb.length() - 1);
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

 3 发送请求,并将请求放进Requestqueue中,我把请求统一封装在一个

    AppRequest类中,这个类如下:

 

 

private void _get(final String url, final String tag, final Callback callback) {

        LogUtils.e(TAG, url);


        StringRequest req = new StringRequest(Request.Method.GET, url,

                new Listener<String>() {

                    @Override

                    public void onResponse(String text) {

                        LogUtils.i(TAG, text);

                        if (callback != null) {

                            LightResponse res = new LightResponse();

                            res.tag = tag;

                            res.url = url;

                            res.status = Models.StatusCode.NetworkSuccess;

                            res.setData(text);

                            callback.onFinish(res);

                        }

                    }

                }, new Response.ErrorListener() {

            @Override

            public void onErrorResponse(VolleyError error) {

                if (callback != null) {

                    LightResponse res = new LightResponse();

                    res.tag = tag;

                    res.url = url;

                    res.status = Models.StatusCode.NetworkError;

                    res.message = error.getMessage();

                    callback.onFinish(res);

                }

            }

        }) {

            @Override

            public Map<String, String> getHeaders() throws AuthFailureError {

                /* 此处是相对于实际业务配置的 */

                return new HashMap<String, String>();

            }

        };

        mQueue.add(req);

    }

 

说明:Volley有2种回调一种是onResponse,一种是onErrorResponse,但是实际开发中可能需要更多的回调需要处理,例如:
1 请求服务器成功,数据无误
2 请求服务器成功,但是可能返回的JSON数据有问题
3 服务器请求成功,但是返回码有问题
4 无网络连接
5 网络正常,但是服务器没返给我们数据(刷新失败)
6 系统发生异常
......
当然我们可以根据实际业务需求来设定相应的回调。
上面我只做了一个CallBack来回调,不管请求失败还是成功,我都调用了onFinish()方法
 4 回调处理

 

 try {
            request.get(url, params, "", new CallbackLightRequest<LightResponse>() {
                @Override
                public void call(LightResponse response) {
                    if (response.isReplied()) {
                        ApiBeans.Followers2 bean = GsonUtil.getFromStr(ApiBeans.Followers2.class, response.getText());//json解析
                        if (bean != null && bean.data != null) {
                            httpCallback.onResponse(bean.data);//请求成功
                        } else {
                            httpCallback.onFailure(new RequestFailure(RequestFailure.Type.parse), null);//解析异常
                        }
                    } else {
                        httpCallback.onFailure(new RequestFailure(RequestFailure.Type.network), null);//网络异常
                    }
                }
            });
        } catch (Exception ex) {
   
            httpCallback.onFailure(new RequestFailure(RequestFailure.Type.exception), ex);//异常处理
        }

 

这里我做了2种类型的回调:
 一  成功
 二  失败(包含4种类型)
回调的接口如下:
public interface HttpCallback<T> {
    void onResponse(T response);//成功回调
    void onFailure(RequestFailure failure, Exception ex);//异常处理
}
 错误的回调类型,这里当然也可以封装成一个泛型
public class RequestFailure {
    public enum Type {
        network,//网络问题
        responseCode,//错误的返回码处理
        exception,//系统异常
        parse, //解析
    }
    public RequestFailure(Type type) {
        this.what = type;
    }
    public Type what;
}
 
network:代表网络连接异常
responseCode:错误的响应码处理
exception:系统异常处理
parse :Json解析异常
5 再次封装
    当上面的代码写多了之后,你会发现你一直在写重复的代码,仔细看看除了回调的对象不一样之外,其它都参数都基本一样,很容易就想到用泛型来对上面的代码进行封装,代码如下:
public static void getFolowFansList(final Context context, final LightRequest request, String userId, String profileUserId,
                                        String timeSince, int count, final HttpCallback<ApiBeans.FollowerListObject<Fan>> httpCallback) {
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("user_id", userId);
        params.put("count", count + "");
        params.put("since_time", timeSince);
        params.put("profile_user_id", profileUserId);
        String url = HttpConstant.DOMAIN_NORMAL + HttpConstant.FRIENDS_FANS_1;
      
        doRequest(request,url, data, httpCallback, ApiBeans.FollowerListObject.class);
    }
  把回调的代码用泛型进行封装
private static <T> void doRequest(LightRequest request,
                                      String url, HashMap<String, String> params,
                                      final HttpCallback callback, final Class<?> cls) {
        try {
            request.get(url, params, "", new CallbackLightRequest<LightResponse>() {
                @Override
                public void call(LightResponse response) {
                    if (response.isReplied()) {
                        T bean = GsonUtil.getFromStr(cls, response.getText());
                        if (bean != null) {
                            callback.onResponse(bean);
                        } else {
                            callback.onFailure(new RequestFailure(RequestFailure.Type.parse), null);
                        }
                    } else {
                        callback.onFailure(new RequestFailure(RequestFailure.Type.network), null);
                    }
                }
            });
        } catch (Exception ex) {
            callback.onFailure(new RequestFailure(RequestFailure.Type.exception), null);
        }
    }
 
6 volley 在项目中进行业务处理
下面看看如何现在封装的Volley在项目中进行业务处理的?
 model.getFasList(mContext, lightRequest, Global.userDetail.userId, profileUserId, thisTimeSince, count,
                new HttpCallback<ApiBeans.FollowerListObject<Fan>>() {
              
                    @Override
                    public void onResponse(ApiBeans.FollowerListObject<Fan> data) {
                        try {
                             //数据返回成功
                            if (data.userList != null) {
                                adapter.setIsAllLoaded(data.infoCount < Constant.FEED_DEFAULT_NUM);
                                lv.setIfHasMore(data.infoCount, Constant.FEED_DEFAULT_NUM);
                                if (isRefresh) {
                                    adapter.setDataList(data.userList);
                                    lv.setAdapter(adapter);
                                } else {
                                    adapter.addDataList(data.userList);
                                    adapter.notifyDataSetChanged();
                                }
                            } else {
                            //刷新失败
                                if (isRefresh) {
                                    ToastModel.showRefreshFail(mContext);
                                } else {
                                    ToastModel.showLoadMoreError(mContext);
                                }
                            }
                        } catch (Exception e) {
                        } finally {
                            isDownloading = false;
                            if (loadingView != null) {
                                loadingView.setVisibility(View.GONE);
                                loadingView = null;
                            }
                            refreshEnd();
                        }
                    }
                    @Override
                    public void onFailure(RequestFailure failure, Exception ex) {
                          //网络异常
                        if (failure.what == RequestFailure.Type.network) {
                            ToastModel.showRed(mContext, R.string.tip_network_error);
                        } else if (failure.what == RequestFailure.Type.parse) {
                            //解析失败
                            ToastModel.showRed(mContext, "解析失败");
                        } else if (failure.what == RequestFailure.Type.exception) {
                            //系统异常
                            ToastModel.showRed(mContext, "系统异常");
                        }
                    }
                });
    }
 
   代码方便简单,通熟易懂,层次分明,逻辑清晰有没有呢?Volley不仅简化了我们的开发流程,而且可以让我们更专注于我们的业务处理。这是volley非常大的一个优点。
 
 
2
0
分享到:
评论

相关推荐

    网络请求框架volley-master

    网络请求框架volley-master网络请求框架volley-master

    Android网络请求框架之volley框架

    Volley是Google官方推出的一款高效的Android网络请求框架,专为Android平台设计,旨在提供轻量级、快速且易于使用的网络通信库。它以其强大的缓存机制、线程管理以及对异步请求的良好支持而受到开发者欢迎。Volley的...

    Android网络通信框架Volley

    **Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一款专门为Android平台设计的网络通信框架,它以其高效的性能、简单的API和良好的可扩展性,成为了众多Android开发者进行网络请求时的...

    安卓网络请求框架volley的封装 轻松实现网络请求

    【Android网络请求框架Volley详解】 在Android应用开发中,网络请求是不可或缺的一部分,Volley是Google推出的一个高效的网络请求库,它优化了网络通信,提供了便捷的API接口,使得开发者能够快速、轻松地实现网络...

    Android-VolleyManager是对android网络请求框架volley的封装

    在Android应用开发中,网络请求是必不可少的一部分,用于获取服务器数据、更新用户界面等操作。Volley是由Google推出的一款高效、易用的网络请求库,它优化了HTTP请求的处理,提高了性能,特别适合实时性要求较高的...

    Android网络请求框架

    本篇文章将详细介绍几个常用的Android网络请求框架:OkHttp、Volley、HttpClient以及XUtils。 一、OkHttp OkHttp是由Square公司开发的一款高效的网络请求库,它具有以下特点: 1. **连接池**:OkHttp维护了一个...

    Android 网络通信框架Volley

    **Android网络通信框架Volley详解** Volley是Google在2013年I/O大会上推出的一个高效的网络通信库,主要用于Android应用中的网络请求。Volley的设计目标是提供一个轻量级、高性能的库,使开发者能够更方便地处理...

    android中网络请求库volley.jar和asnychttp.jar

    Volley的设计目标是为了优化Android应用的性能,减少网络请求的延迟,提高用户体验。它内置了缓存机制,能够自动处理网络请求的缓存策略,减少了不必要的网络通信。Volley还支持多种请求类型,如GET、POST等,并且...

    Android网络框架-Volley(一) 初步使用Volley

    Volley是Google为Android开发的一款高效的网络通信库,它的设计目标是简化网络请求,并优化了内存管理和线程处理,使得在网络交互中能提供快速、流畅的用户体验。在本篇文章中,我们将深入探讨Volley的基本使用,...

    android网络通信框架 Volley的小Demo

    上传的是一个eclipse下的android工程,主要展示的是对android 的网络通信框架 Volley的简单使用,展示了一些api的使用,有get和post方法的请求方式以及网络图片的缓存等等,我正是使用了这个demo 完成了我的一个在线...

    Android网络通信框架Volley的解析和比较.pdf

    【Android 网络通信框架 Volley 的解析和比较】 在 Android 应用程序开发中,网络通信是不可或缺的一部分,主要用于客户端和服务端的数据交互。Volley 是 Google 在 2013 年的 Google I/O 大会上推出的一款针对 ...

    Google I/O 2013推荐Android 网络通信框架Volley

    Volley是Google在2013年的I/O大会上推出的一款高效的Android网络通信框架,它专为Android应用设计,旨在简化网络请求的处理,提高应用程序的响应速度和用户体验。这款框架的核心理念是快速、高效和易用,使得开发者...

    网络请求框架Volley

    Volley是Google在2013年I/O大会上推出的一款强大的网络请求库,专为Android应用设计,旨在简化网络通信并优化性能。它的主要特点包括高效的数据缓存、线程管理以及对异步请求的优秀支持,使得开发者可以快速、方便地...

    android网络请求框架 HttpClient与Volley的性能对比

    本文将对HttpClient和Volley这两款网络请求框架进行详细的性能对比。 HttpClient,全称为Apache HttpClient,是一个基于HTTP协议的客户端编程工具包。它提供了丰富的API,可以处理各种HTTP请求,如GET、POST等。...

    android最新网络框架Volley使用实例

    Volley是Google为Android开发的一款高效的网络通信框架,它的设计目标是简化网络请求,并优化Android设备上的图片加载。Volley以其高效、灵活和易于使用的特性,成为许多Android开发者首选的网络库。 首先,我们来...

Global site tag (gtag.js) - Google Analytics