`
程言方
  • 浏览: 47534 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Volley的使用

 
阅读更多
一:volley在android2.3之前使用的是HttpClient进行联网,在2.3及以上版本使用的是HttpUrlConnection联网方式;
     android新的网络通信库,更快更稳定;适用于通信数据量不大,但是非常频繁的情景;
二:volley提供的功能:
JSON,图像等的异步下载;
网络请求的排序(scheduling)
网络请求的优先级处理
缓存
多级别取消请求
和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
三:适用volley的NetworkImageView
Volley提供了一个新的控件NetworkImageView来代替传统的ImageView,这个控件的图片属性可以通过
mImageView.setImageUrl(url, imageLoader)
来设定。而且,这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。
四:适用自定制的request
我们也可以通过继承Request根据自己的需求来定制自己的request
@Override
protected Response parseNetworkResponse(NetworkResponse response) {
    try {
        String json = new String(
                response.data, HttpHeaderParser.parseCharset(response.headers));
        return Response.success(
                gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
    } catch (UnsupportedEncodingException e) {
        return Response.error(new ParseError(e));
    } catch (JsonSyntaxException e) {
        return Response.error(new ParseError(e));
    }
}
里面使用的gson(com.google.gson.Gson)是JSON的序列化和反序列化的库,可以在JSON和java model object之间进行转换。
以下是使用自定制request的例子:
mRequestQueue.add( new GsonRequest(url, ListResponse.class, null,
    new Listener() {
        public void onResponse(ListResponse response) {
            appendItemsToList(response.item);
            notifyDataSetChanged();
        }
    }
}

五:volley使用示例:
1.创建自己的request继承自Volley的request,实现相应的方法,设置请求信息和请求成功回调接口;
public class VolleyRequest extends Request<NetworkResponse> {

private final Listener<NetworkResponse> mListener;
private byte[] mRequestBytes;
private Map<String, String> mHeaders;

/**
* 初始化请求
*
* @param method
*            请求类型
* @param url
*            请求地址
* @param listener
*            成功回调
* @param errorListener
*            失败回调
*
* */
public VolleyRequest(int method, String url,
Listener<NetworkResponse> listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;

}

@Override
protected void deliverResponse(NetworkResponse response) {
mListener.onResponse(response);
}

@Override
protected Response<NetworkResponse> parseNetworkResponse(
NetworkResponse response) {
return Response.success(response,
HttpHeaderParser.parseCacheHeaders(response));
}

public void setRequestBytes(byte[] pRequestBytes) {
this.mRequestBytes = pRequestBytes;
}

@Override
public byte[] getBody() throws AuthFailureError {
return mRequestBytes;
}

public void setHeaders(Map<String, String> pHeaders) {
this.mHeaders = pHeaders;
}

@Override
public Map<String, String> getHeaders() throws AuthFailureError {
if(mHeaders!=null&&mHeaders.size()>0)
return mHeaders;
return  Collections.emptyMap();
}

}
2.创建一个外部调用Volley的接口,该接口提供创建自定义request以及对应回调接口的方法:
public class VolleyConnection {

private Context mContext;
private String mUrl;
private byte[] mRequestBytes;
private IHttpCallback mHttpCallback;
private int METHOD;

/**
* 判断同步方式 HTTP POST或GET
*
* @param aUrl
*            服务器地址
* @param aRequestBytes
*            POST到服务器的数据。
* @param aCallBack
*            回调接口。
*
* */
public VolleyConnection(Context aContext, String aUrl,
byte[] aRequestBytes, IHttpCallback aCallBack) {
mContext = aContext;
mUrl = aUrl;
mRequestBytes = aRequestBytes;
mHttpCallback = aCallBack;
if (mRequestBytes == null || mRequestBytes.length == 0)
METHOD = Request.Method.GET;
else
METHOD = Request.Method.POST;
}

private Listener<NetworkResponse> getResponseListener() {
return new Response.Listener<NetworkResponse>() {
@Override
public void onResponse(NetworkResponse response) {
if (mHttpCallback != null) {
mHttpCallback.onCompleted(response.statusCode,
response.data);
}
}
};
}

private ErrorListener getErrorListener() {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
if (mHttpCallback != null) {
mHttpCallback.onException(error);
}
}
};
}

public void connect() {
VolleyRequest request = new VolleyRequest(METHOD, mUrl,
getResponseListener(), getErrorListener());
// if (BasicAuthorUtil.isBasicAuthor(mUrl)) {
Map<String, String> headers = new HashMap<String, String>();
headers.put(
"Authorization",
"Basic "
+ new String(Base64.encodeBase64("flsyjh:flSYjhx2012"
.getBytes())));
request.setHeaders(headers);
// }
request.setRequestBytes(mRequestBytes);
VolleyConnectionManager.addRequest(request, mContext);
}

}
3.提供一个Manager对象,该对象提供 一个全局静态变量RequestQueue,并在应用启动时初始化该队列,并在内部封装添加自定义request和提供自定义request的接口;外部接口进行联网时每次创建一个requst然后放到requestQueue列表;
public class VolleyConnectionManager {

private static RequestQueue mRequestQueue;

public static void init(Context context) {
mRequestQueue = Volley.newRequestQueue(context);
}

public static RequestQueue getRequestQueue() {
if (mRequestQueue != null) {
return mRequestQueue;
} else {
throw new IllegalStateException("RequestQueue not initialized");
}
}

public static void addRequest(Request<?> request, Object tag) {
if (tag != null) {
request.setTag(tag);
}
mRequestQueue.add(request);
}

public static void cancelAll(Object tag) {
mRequestQueue.cancelAll(tag);
}
}
分享到:
评论

相关推荐

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

    Volley以其高效、灵活和易于使用的特性,成为许多Android开发者首选的网络库。 首先,我们来详细了解一下Volley的核心特性: 1. **缓存策略**:Volley提供了内存和磁盘两级缓存机制,可以有效地减少网络请求,提高...

    volley使用例子

    在“Volley使用例子”中,我们主要探讨如何使用Volley来加载ListView中的图片。 首先,Volley的核心在于其强大的请求队列管理。它通过将网络请求分发到线程池中执行,避免了主线程被阻塞,提高了用户体验。Volley...

    volley使用的demo

    这个“Volley使用的demo”是一个实际应用示例,演示了如何利用Volley框架来加载网络图片。下面我们将深入探讨Volley的关键特性和在Android应用程序中的使用方法。 ### 1. Volley简介 Volley设计的核心目标是速度和...

    Volley使用,包含get、post请求,获取String/JsonObject/JsonArray数据(android客户端+java服务器端)

    Volley是Google推出的一款高效的Android网络请求库,它旨在简化Android应用中的网络操作,通过减少网络请求的延迟...通过学习和掌握Volley的使用,开发者可以更好地优化Android应用的网络性能,提供更流畅的用户体验。

    Android-网络通信框架Volley使用详解

    在Android应用开发中,网络通信是必不可少的一部分,而Volley是一个高效的网络通信库,由Google设计并推荐使用。本文将详细解析如何使用Volley进行网络请求,包括GET、POST、图片加载、HTTPS通信、处理Cookie以及...

    Volley使用

    volley使用代码,测试volley的使用与封装.Volley是2013年Google I/O大会上推出了一个新的网络通信框架,Volley特别适合数据量不大但是通信频繁的场景,不支持 post 大数据,不适合上传文件。

    Volley 使用遇到的种种问题

    使用Volley StringRequest和JsonObjectRequest遇到的一些问题。博客地址:http://blog.csdn.net/onlysnail/article/details/47905375

    Volley使用demo

    这个"Volley使用demo"包含了一些核心组件和实践应用,让我们深入了解一下Volley的关键特性。 首先,`VolleyErrorHelper.java`可能是一个自定义错误处理类,用于封装Volley在处理网络请求时可能出现的异常。在Volley...

    使用Volley-jar的包

    - **多线程支持**:Volley使用RequestQueue管理网络请求,内部实现异步处理,确保UI线程不被阻塞。 2. **Volley的基本组件**: - **RequestQueue**:这是Volley的核心,负责管理所有网络请求,调度它们的执行顺序...

    volley框架的使用

    4. ResponseCache:Volley使用缓存策略来存储响应数据,当网络不可用或为提高性能时,可以从缓存中直接读取数据。 5. BasicNetwork:Volley默认使用HttpStack处理HTTP请求,如HurlStack,它可以使用...

    android Volley的基本使用详解

    Volley是Android平台上的一个网络库,由Google开发并推荐使用,主要针对移动设备的特点进行了优化,特别适合处理大量的小数据量的网络请求。Volley提供了高效、易用且功能丰富的网络通信框架,使得开发者可以方便地...

    Android Volley框架的基本使用解析

    Android之Volley框架的使用,包括Volley的get和post请求方式的使用、Volley的取消队列网络请求和Volley与Activity生命周期的联动、Volley的简单的二次回调封装、Volley加载图片的介绍及用法

    android volley

    4. **异步处理**:Volley 使用线程池管理网络请求,将网络操作与主线程分离,避免阻塞 UI。 5. **强大的错误处理**:Volley 提供了一套完整的错误处理机制,可以捕获和处理各种网络和解析错误。 6. **多种请求类型...

    Volley Demo 2 源代码

    1. **内存缓存**:Volley使用LRU(Least Recently Used)最近最少使用算法来管理内存中的缓存。当内存缓存达到预设的大小限制时,会优先移除最近最少使用的数据。这种方式确保了常用数据的快速访问,同时避免了内存...

    Volley源码及文档

    Volley使用了一个基于内存和磁盘的两级缓存策略。内存缓存提供快速访问,而磁盘缓存用于存储长期数据。当请求数据时,Volley首先尝试从内存缓存中获取,如果未命中,则检查磁盘缓存。如果数据在缓存中都未找到,...

    Android使用Google推荐的联网框架Volley,让连接网络更加简单

    3. **线程管理**:Volley使用工作线程来执行网络请求,主线程只负责UI更新,避免了因网络操作阻塞UI导致的卡顿问题。 4. **强大的错误处理**:Volley提供了全面的错误处理机制,方便开发者对各种网络异常进行捕获和...

    volley-master包

    以下是对 Volley 主要特性和使用方法的详细说明: 1. **异步请求**:Volley 提供了基于线程池的异步网络请求管理,可以并发处理多个请求,并且自动管理这些请求的优先级和执行顺序,避免了主线程阻塞,提高了用户...

    Volley框架源代码

    2. Cache:Volley使用内存缓存和磁盘缓存相结合的方式,对数据进行高速缓存。内存缓存响应迅速,但容量有限;磁盘缓存容量大,但读写速度相对较慢。Volley通过LruCache实现内存缓存,通过DiskBasedCache实现磁盘缓存...

Global site tag (gtag.js) - Google Analytics