Volley,小并发网络请求的好帮手
不得不说,当不了解一件事情的时候,就会像当然的认为,其很神秘。但是当真正的接触到了这些神秘的item,就不会有这种感觉了。作为一个android开发新手的我,刚接触到了Volley这个开源的网络请求框架,就瞬间被她打动了。下面我就谈一谈我对Volley的一些理解。
Volley是什么?
Volley是谷歌在2013年的I/O大会上发布的一个网络请求的框架,Volley在性能方面进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。其模型如图所示。
Volley怎么用?
说到了Volley的使用方法,我们就需要先了解一下这个框架的实现业务的流程了,如下:
然后就是了解一下API中相关的常用的几个类及其用法了。
- Volley:Volley 对外暴露的 API,通过 newRequestQueue(…) 函数新建并启动一个请求队列RequestQueue。
- Request:表示一个请求的抽象类。StringRequest、JsonRequest、ImageRequest都是它的子类,表示某种类型的请求。
- RequestQueue:表示请求队列,里面包含一个CacheDispatcher(用于处理走缓存请求的调度线程)、NetworkDispatcher数组(用于处理走网络请求的调度线程),一个ResponseDelivery(返回结果分发接口),通过 start() 函数启动时会启动CacheDispatcher和NetworkDispatchers。
CacheDispatcher:一个线程,用于调度处理走缓存的请求。启动后会不断从缓存请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理。当结果未缓存过、缓存失效或缓存需要刷新的情况下,该请求都需要重新进NetworkDispatcher去调度处理。 - NetworkDispatcher:一个线程,用于调度处理走网络的请求。启动后会不断从网络请求队列中取请求处理,队列为空则等待,请求处理结束则将结果传递给ResponseDelivery去执行后续处理,并判断结果是否要进行缓存。
- ResponseDelivery:返回结果分发接口,目前只有基于ExecutorDelivery的在入参 handler 对应线程内进行分发。
- HttpStack:处理 Http 请求,返回请求结果。目前 Volley 中有基于 HttpURLConnection 的HurlStack和 基于 Apache HttpClient 的HttpClientStack。
- Network:调用HttpStack处理请求,并将结果转换为可被ResponseDelivery处理的NetworkResponse。
Cache:缓存请求结果,Volley 默认使用的是基于 sdcard 的 - DiskBasedCache。NetworkDispatcher得到请求结果后判断是否需要存储在 Cache,CacheDispatcher会从 Cache 中取缓存结果。
好了该知道的我们也差不多都知道了,下面就来一个小例子实际的体验一把吧。
我的Volley小例子
我要完成的是点击一个按钮,然后在下边的两个ImageView上显示一张图片。那么,开始吧。
首先我们要做的就是在我们新建的工程的libs目录下导入需要的Volley.jar包。然后并把其classpath导入。
然后就是设计布局,完善业务逻辑代码。请看下面的详细的解释。
首先是布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/btn_getimage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="24dp"
android:onClick="setImageTo"
android:text="GetImage" />
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/btn_getimage"
android:layout_centerInParent="true"
android:layout_marginTop="7dp"
android:visibility="invisible"
android:src="@drawable/ic_launcher"
/>
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/imageview"
android:layout_centerInParent="true"
android:layout_gravity="center_horizontal"
android:src="@drawable/error"
/>
</RelativeLayout>
然后是Java代码:
package com.guoribiao.volleytest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.util.LruCache;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
public class MainActivity extends Activity {
private Button mButton;
private ImageView mImageview;
private NetworkImageView networkImageView;
public void initView() {
mButton = (Button) findViewById(R.id.btn_getimage);
mImageview = (ImageView) findViewById(R.id.imageview);
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void setImageTo(View view ){
setImage();
setImageByNetworkImageView();
}
/**
* 使用volley自带的一个网络图片控件实现网络图片的加载
*/
private void setImageByNetworkImageView() {
//设置网络请求的图片的URL地址
String requestUrl = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1461212709&di=978a557d108c531a9f76f225454d0c5b&src=http://img5.duitang.com/uploads/item/201509/10/20150910195025_uaSzx.jpeg";
//创建一个请求队列
RequestQueue queue = Volley.newRequestQueue(this);
//使用缓存机制缓存图片
final LruCache<String , Bitmap> lruCache = new LruCache<String, Bitmap>(20);
//借助于上面的lrucache实现ImageCache的设置
ImageCache imageCache = new ImageCache(){
@Override
public Bitmap getBitmap(String url) {
lruCache.get(url);
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url, bitmap);
}
};
//创建一个图片加载器
ImageLoader imageLoader = new ImageLoader(queue,imageCache);
//给控件设置标签
networkImageView.setTag("url");
//设置将要显示的图片的URL和图片加载器
networkImageView.setImageUrl(requestUrl, imageLoader);
}
/**
* 借助于Volley加载网络上的一张图片到一个ImageView控件上
*/
private void setImage() {
//将ImageView设置为可见的状态
mImageview.setVisibility(1);
//设置一个请求队列
RequestQueue queue = Volley.newRequestQueue(this);
//设置图片所在的URL的地址
String imageUrl = "http://www.baidu.com/img/bd_logo1.png";
//设置一个lrucache
final LruCache< String , Bitmap > cache = new LruCache<String, Bitmap>(20);
//生成一个图片缓存器
ImageCache imageCache = new ImageCache(){
@Override
public Bitmap getBitmap(String url) {
cache.get(url);
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
};
//初始化一个图片加载器
ImageLoader imageLoader = new ImageLoader(queue,imageCache);
//设置图片加载过程中的一个侦听,并添加到要进行显示的控件上
ImageListener listener = ImageLoader.getImageListener(mImageview, R.drawable.ic_launcher, R.drawable.error);
//设置加载的URL地址和监听器
imageLoader.get(imageUrl, listener);
}
}
最后,别忘了在manifest.xml清单文件中声明一下网络权限。
<uses-permission android:name="android.permission.INTERNET"/>
最后来看一下测试的结果吧。
而且,当我们刚点击按钮的时候会发现,上面的那个ImageView控件会显示一个默认的ic_launcher图标.这是因为它刚刚正在加载。加载完成后,就会显示正常的网络图片了。
总结
使用Volley的话,适合于那些小流量,请求次数频繁的网络请求,不适合于大数据的下载,所以我们需要按照自己的需求来选择使用。
改进的方向:
别人的,虽然好用,但是不是最适合自己的。我们可以在Volley的基础上,创建自己的网络请求资源代码库,比如说将特殊需求的网络请求进行二次封装,这样可以省去很多时间编写重复性的代码。还能有效的处理。何乐而不为呢。
Volley,小并发网络请求的好帮手的更多相关文章
- 微信小程序 网络请求之re.request 和那些坑
微信小程序有四种网络请求类型,下面只详细介绍普通HTTPS请求(wx.request) 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downlo ...
- Volley与XUtils网络请求使用对比,心得,两者基本使用
之前一直使用的Volley作为网络请求框架,它是Google 在2013年的I/O大会 上,发布的.Volley是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮,同时扩展性很强.在 ...
- Volley框架之网络请求和图片加载
Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架. Volley的特性 (1).封装了的异步的请求API.Volley 中大多是基于接口的设计,可配置性强.(2). ...
- 使用dispatch_group实现并封装分组并发网络请求
在实际开发中我们通常会遇到这样一种需求:某个页面加载时通过网络请求获得相应的数据,再做某些操作.有时候加载的内容需要通过好几个请求的数据组合而成,比如有两个请求A和B,我们通常为了省事,会将B请求放在 ...
- 第三篇、微信小程序-网络请求API
wx.request(OBJECT)发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 效果图: net.js Page({ data:{ result:{} ...
- 微信小程序网络请求的setDate
我感觉这个无比的奇葩..... 因为之前react的时候,我习惯在请求成功的时候直接this.setDate.........但是,在微信小程序中,一定要将this换成一个变量...一定要!!!否则会 ...
- 微信小程序网络请求wx.request请求
最近微信小程序开始开放测试了,小程序提供了很多api,极大的方便了开发者,其中网络请求api是wx.request(object),这是小程序与开发者的服务器实现数据交互的一个很重要的api. 百牛信 ...
- 035 Android Volley框架进行网络请求
1.volley入门介绍 开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行HTTP通 ...
- 微信小程序 网络请求之设置合法域名
设置域名 登录微信公众号后台小程序中 设置→开发设置→服务器设置 必须设置域名,微信小程序才能进行网络通讯,不然会报错 如果设置好了合法域名,开发工具还提示不在合法域名列表中,因为在微信会有一段时间的 ...
随机推荐
- BZOJ4926 皮皮妖的递推
第二次乱出题.为了方便,以m=2为例,把原式变一下形,得f(i)+f(f(i-1))=i我们先无视掉那个-1,我们发现:诶,这个东西好像斐波那契数列.具体地,我们用f(n)表示把n用斐波那契数列进行拆 ...
- java.lang.NumberFormatException: For input string: " "
原因:这个异常是说,在将字符串""转换为number的时候格式化错误.额,很简单的异常,以前我是写个方法,然后遍历对比不正确的数字或者用正则表达式之类的.现在发现一个很漂亮的方法, ...
- MySQL的Explain关键字查看是否使用索引
explain显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.简单讲,它的作用就是分析查询性能. explain关键字的使用方法很简单,就是 ...
- php闭包类外操作私有属性
Closure::bind() Closure::bindTo(); class person{ private $age; private $sex; public function __const ...
- 数据挖掘_requests模块的post方法
前面已经跟大家讲了requests模块的get方法,这一篇文章我们要介绍的是requests模块中的另一个比较常用的方法,post方法 post方法的形式相比于get要复杂一些,这时因为post在提交 ...
- Android ImgView属性
ImageView是用于界面上显示图片的控件. 属性 1.为ImageView设置图片 ①android:src="@drawable/img1": src设置图片,默认图片等比例 ...
- No package tomcatX available. 解决办法
当一个新的linux系统到手时,就要开始部署相关软件等等,有时候可能遇到无法安装的情况. 例如yum install tomcat7,在centos下无法安装,因为tomcat不再yum里面,怎么办呢 ...
- ionic安装教程
首先是安装node.js,通过nodejs官网下载,网址https://nodejs.org/en/.如果下载许要教程推荐这个https://www.cnblogs.com/zhouyu2017/p/ ...
- Dapper连接与事务的简单封装
增删改查方面,已经有Dapper.Extension这么强大的工具了,我也实在没啥好写的,就随手写了个看起来比较优雅的连接与事务的封装.在之后使用Dapper.Extension类库时,完全可以照搬进 ...
- android Git命令家底儿及Git数据通信原理详解
声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载. 现在大部分使用的都是SVN,也有一部分迁移了Git,虽然挺好的,不过还有其它很多版本控制的工具,并没有谁最好用,最重要的是适合自己的公 ...