Volley 介绍
Volley是在Google I/O 2013发布的一款网络请求框架,主要用于小数据量的网络请求,包括图片的异步加载和缓存功能。在开发中可以很好的帮助开发者进行网络操作,并且更加高效。
Volley的英文意为“齐射”,在发布Volley时Goole的配图就是一副射箭的图,可以看出来,齐射的箭支并不太多,这说明,它特别适合数据量不是太大的网络请求。在手机端一般没有太大的请求量,所以Volley特别适合Android开发使用。
Volley的优点
- 自动调度网络请求(Automatic scheduling of network requests.)
- 高并发的网络连接(Multiple concurrent network connections.)
- 使用标准的HTTP cache coherence响应透明磁盘和内存缓存。(Transparent disk and memory response caching with standard HTTP cache coherence.)
- 支持设定请求优先级(Support for request prioritization.)
- 请求可取消。你可以取消单一请求,或者设置取消请求队列的某一块后者某个区域。(Cancellation request API. You can cancel a single request, or you can set blocks or scopes of requests to cancel.)
- 可扩展性,例如:请求重试和回退。(Ease of customization, for example, for retry and backoff.)
- 强制排序,让你可以更简单的异步的获取网络数据,并且将数据显示在UI界面上。(Strong ordering that makes it easy to correctly populate your UI with data fetched asynchronously from the network.)
- 测试跟踪工具(Debugging and tracing tools.)
Volley擅长于通过RPC(Remote Procedure Call Protocol)类型的操作来填充UI,例如抓取页面的搜索数据作为结构数据,它可以与任何协议结合,并且支持 String,JSON,图片,Volley内置模板代码,这样你就可以专心处理app的逻辑。
Volley不适合大数量的下载或者流操作,因为Volley一直持有着所有的连接。对于大型下载操作,建议使用DownloadManager,或者别的框架,例如OKHttp等。
Volley 的下载
Volley的源码在AOSP仓库中,具体位置在frameworks/volley
下,里面包含主要的请求调度管道,在toolbox
包下也有一套常用的实用工具。将Volley集成到你的项目里,最简单的方式是用Git把源码clone下来,把源码设置成依赖库。
1.使用下面的Git命令从仓库中clone代码
git clone https://android.googlesource.com/platform/frameworks/volley
2.将下载的源码作为一个module导入到你的项目中,也可以打成一个jar包
在使用git clone Volley 源码的时候,会遇到以下情况
$ git clone https://android.googlesource.com/platform/frameworks/volley
Cloning into 'volley'...
fatal: unable to access 'https://android.googlesource.com/platform/frameworks/volley/': Failed to connect to android.googlesource.com port 443: Timed out
没错你猜的没错,就是被墙了,就算用了翻墙软件,开启全局模式也无济于事;当然也不是没有办法,可以设置一下 git 代理,命令如下:
$ git config --global http.proxy "localhost:1080"
运行之后,马上试试,看是不是像下面一样OK
$ git clone https://android.googlesource.com/platform/frameworks/volley
Cloning into 'volley'...
remote: Counting objects: 135, done
remote: Finding sources: 100% (135/135)
remote: Total 3193 (delta 302), reused 3193 (delta 302)
Receiving objects: 100% (3193/3193), 1.22 MiB | 39.00 KiB/s, done.
Resolving deltas: 100% (302/302), done.
Checking connectivity... done.
但是,设置完毕代理之后,最好恢复一下,否则可能影响Git的使用
git config --global --unset http.proxy
###Volley 的简单使用
我们在使用Volley时,首先会创建一个RequestQueue
,然后会传递一个Request
对象给它;RequestQueue
用来管理网络操作线程,读取和写入缓存,解析返回数据。请求对象解析完返回数据后,Volley会将解析的返回结果交给主线程。下图是一个请求的生命周期:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJeLMT4y-1588063393856)(http://developer.android.com/images/training/volley-request.png)]
该示例使用的是Android Studio 1.5.1
一. 将Volley导入项目中,有两种方式
1. File->New->Import->选择Volley->Finish;
2. 将Volley拷贝到你的项目的同级目录下,修改setting.gradle,在第一行的末尾添加括号中的内容 (,':volley'),然后点击右上角的`Sync Now`,然后稍等一会等Build完毕就OK了。
3. 当build成功之后,Volley文件夹右下角会有一个类似书架图像。
4. 打开你项目的`build.gradle`文件在 `dependencies`下面添加括号中的内容 (compile project(':volley')),然后点击右上角的`Sync Now`,等待build完毕就Ok了。
5. 或者右击不得项目根目录->Open Model Setting->在弹出的窗口的右上侧点击 Dependencies ->点击右侧绿色的加号->Module Dependency->选择Volley -> OK
二. 在AndroidManifest.xml的manifest节点下添加网络请求的权限
<uses-permission android:name="android.permission.INTERNET"/>
三. Volley 提供了一个方便的方法Volley.newRequestQueue
来获取一个RequestQueue
对象。使用默认的设置来开始请求队列。
public class VolleyStringRequestActivity extends AppCompatActivity {
public static final String mUrlStr = "https://www.baidu.com/";
TextView mTextView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_volley_string_request);
mTextView = (TextView) findViewById(R.id.textView);
requestUseVolley();
}
private void requestUseVolley() {
//1.获取一个RequestQueue
RequestQueue queue = Volley.newRequestQueue(this);
//2.创建一个请求,其返回的结果以String 形式返回
StringRequest stringRequest = new StringRequest(Request.Method.GET, mUrlStr, new Response.Listener<String>() {
@Override
public void onResponse(String response) {//请求成功返回的回调
//将返回的数据显示到TextView上
mTextView.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {//请求失败返回的回调
mTextView.setText(error.getMessage());
}
});
//3.将请求添加的请求队列中,在这里请求就已经开始了
queue.add(stringRequest);
}
}
除了返回String的请求,相应的还有JsonObjectRequest、JsonArrayRequst和ImageRequst,用来返回JSONObject、JSONArray和Bitmap ;用法跟StringRequst 类似。这里就不赘述了,下节再具体讨论。
上面的例子还是有些问题的,在下一节会继续讲解