技术库 > Java

Volley网络通信框架

技术库:tec.5lulu.com

from:tec.5lulu.com

Volley适用于通讯量不大但是通信频繁的操作。Volley封装了网络请求,json数据处理,图片加载,缓存处理以及强大的功能调试和跟踪处理的功能。

1 Volley的架构设计

Volley使用了线程池来作为基础结构,主要分为主线程,cache线程和network线程。

主线程和cache线程都只有一个,而NetworkDispatcher线程可以有多个,这样能解决比并行问题。如下图:

volley的引入是因为开发过程中会遇到如下问题

1、比如以前从网上下载图片的步骤可能是这样的流程:在ListAdapter#getView()里开始图像的读取。

通过AsyncTask等机制使用HttpURLConnection从服务器去的图片资源

在AsyncTask#onPostExecute()里设置相应ImageView的属性。

而在Volley下,只需要一个函数即可,详细见后面的例子。

2、屏幕旋转的时候,有时候会导致再次从网络取得数据。为了避免这种不必要的网络访问,我们可能需要自己写很多针对各种情况的处理,比如cache什么的。

3、ListView的时候,我们滚动过快,可能导致有些网络请求返回的时候,早已经滚过了当时的位置,根本没必要显示在list里了,虽然我们可以通过ViewHolder来保持url等来实现防止两次取得,但是那些已经没有必须要的数据,还是会浪费系统的各种资源。

Volley提供的功能可以解决上面的问题:
1、JSON,图像等的异步下载;

2、网络请求的排序(scheduling)

3、网络请求的优先级处理

4、缓存

5、多级别取消请求

6、Activity生命周期的联动(Activity结束时同时取消所有网络请求)

通过代码来学习Volley具体的使用

获取String

Volley网络通信框架,by 5lulu.com


获得json对象

Volley网络通信框架,by 5lulu.com

异步加载图片

Volley网络通信框架,by 5lulu.com


Volley还提供了一个NetworkImageView类。 利用这个类,我们可以更有效率地去从网络去获取图片,因为它里面帮我们多设置了一个缓存,帮我们自己去处理请求的队列。

NetworkImageView类的具体使用方式如下:

1)在XML中定义:

Volley网络通信框架,by 5lulu.com

就相当于使用自定义的View,这里是com.android.volley.toolbox.NetworkImageView。

2)然后在Activity中使用:

Volley网络通信框架,by 5lulu.com

ImageLoader是NetworkImageView类中真正去跟网络打交道,获取图片的类,而在它的构造函数中,我们发现还需要去实现一个ImageCache接口的类,即上面的LruImageCache类,这是作为ImageLoader的内存缓存类,也就是通常所说的一级缓存了(L1)。

ImageCache是ImageLoader的内部接口,其定义如下:

Volley网络通信框架,by 5lulu.com

所以在利用NetworkImageView之前,我们还需要先去实现这个接口,而Volley推荐的也就是LruCache,代码中的LruImageCache实现如下:

Volley网络通信框架,by 5lulu.com

利用了 LruCache 来作为缓存,然后实现 ImageCache 的 getBitmap 和 putBitmap 方法。

然后将上面创建的 mQueue 和 LruImageCache 作为参数传递给其构造函数,这样 ImageLoader 对象就创建了。

第三步:调用 NetworkImageView 的 setImageUrl 方法,在这里,将 ImageLoader 传给它,然后就可以了。不过 Volley 推荐呢,在设置url之前,可以调用其以下两个方法:

Volley网络通信框架,by 5lulu.com


所以,我们在上面调用setImageUrl之前,也调用了这两个方法,其目的有两个:

1)调用 setDefaultImageResId,设置一个默认的图片显示,直到网络上的图片load完为止。

2)调用 setErrorImageResId,设置一个错误的图片,在网络加载过程中出错的时候展示。

这个控件在被从父控件detach的时候,会自动取消网络请求的,即完全不用我们担心相关网络请求的生命周期问题。

示例代码如下:

mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache());if(holder.imageRequest != null) {

if(holder.imageRequest != null) {

holder.imageRequest.cancel();

}

holder.imageRequest = mImageLoader.get(BASE_UR + item.image_url, holder.imageView, R.drawable.loading, R.drawable.error);

总结:

Volley简化了开发过程中网络请求的部分,特别是对Json和异步加载图片的处理。但是Volley在大数据流媒体方面还是需要使用原始的方法。

Volley网络通信框架


标签: 线程 缓存本文链接 http://tec.5lulu.com/detail/110dan2eh6gea852a.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com