Android Volley解析(1)

来源:互联网 发布:天天向上 欧弟 知乎 编辑:程序博客网 时间:2024/05/16 11:23

1. Volley简介
Volley是Google I/O 2013推出的网络通信库,将HTTP的通信操作再进行简单化。可以从GitHub
上获取Volley 。

Volley提供以下特性:
· 自动调度网络请求。
· 多个并发网络连接。
· 具有标准HTTP 缓存一致性的磁盘和内存缓存 。
· 支持请求优先级。
· 支持取消请求。您可以取消单个请求,也可以设置要取消的请求块或范围。
· 支持客制化。例如: 重试策略
· 请求排序,可以轻松地从网络异步获取数据来正确填充您的UI。
· 完善的调试和跟踪工具。

Volley擅长用于填充UI的RPC(Remote Procedure Call Protocol)类型操作,例如将搜索结果页作为结构化数据。它可以轻松地与任何协议集成起来,支持原始字符串,图像和JSON。通过为您需要的功能提供内置支持,Volley可以免于编写样板代码,并允许您专注于您应用程序特有的逻辑。

2. 适用场景
适用于数据量不大,但网络通信频繁的。
Volley不适合大型下载或流式传输操作,因为Volley在解析过程中将所有响应都存储在内存中。对于大型下载操作,请考虑使用其他替代方法DownloadManager。

3.下载
核心的Volley库是在GitHub上开发的,

为您的项目添加Volley的最简单方法是将以下依赖项添加到应用程序的build.gradle文件中:

dependencies {    ...    compile 'com.android.volley:volley:1.0.0'}

您还可以通过git命令下载源码:

git clone https://github.com/google/volley

4.发送一个简单请求

final TextView mTextView = (TextView) findViewById(R.id.text);...//首先获取一个RequestQueue对象//注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,//然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常适合//高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是//非常浪费资源的。RequestQueue queue = Volley.newRequestQueue(this);String url ="http://www.baidu.com";// 接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象。//可以看到,这里new出了一个StringRequest对象,StringRequest的构造//函数需要传入四个个参数,第一个参数就是HTTP的请求类型,第二个参数就是//目标服务器的URL地址,第三个参数是服务器响应成功的回调,第四个参数是//服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,//然后在响应成功的回调里显示服务器返回的内容,在响应失败的回调里打印出失败的详细信息。StringRequest stringRequest = new StringRequest(Request.Method.GET, url,            new Response.Listener<String>() {    @Override    public void onResponse(String response) {        // Display the first 500 characters of the response string.        mTextView.setText("Response is: "+ response.substring(0,500));    }}, new Response.ErrorListener() {    @Override    public void onErrorResponse(VolleyError error) {        mTextView.setText("That didn't work!");    }});// 将这个StringRequest对象添加到RequestQueue里面就可以了queue.add(stringRequest);

Volley总是在主线程返回服务器响应解析结果(网络请求和响应解析是在工作线程)。在主线程运行可以方便地使用接收到的数据填充UI控件,因为你可以直接在回调中修改UI。

源码中请求流程
如上所示,要发送请求,您只需构建一个请求,并调用RequetQuene的add()方法将其添加到请求队列。一旦添加到队列中,它将排队等待,获取服务,解析网络响应并返回结果。

Volley运行一个缓存处理线程(CacheDispatcher)和一个网络调度线程池(NetworkDispatcher)。当调用add()向队列添加请求时,它由缓存线程(CacheDispatcher)获取处理:如果请求在缓存中命中,缓存线程将从缓存中解析响应,并将解析的响应在主线程上传递。如果请求无法命中缓存,则将其放置在网络请求队列上。第一个可用的网络线程处理请求,执行HTTP请求服务,解析网络响应,并将响应写入缓存,然后将解析的响应发回主线程进行传递。
注意,诸如I / O和解析/解码等耗时操作在工作线程上完成。您可以从任何线程添加请求,但响应始终在主线程上传递。

请求声明周期

5.取消请求
要取消请求,调用Request对象的cancel()方法。一旦取消,Volley确保您的响应不会被处理。意味着您可以在Activity的onStop()方法中取消所有待处理的请求, 不必对您的响应处理进行保护类检查如:getActivity() == null等;

要使用此特性,您通常必须跟踪标记所有正在运行的请求,以便能够在适当的时间取消它们。有一个更简单的方法:您可以将标记对象与每个请求相关联。然后,您可以使用此标记来制定过滤要取消的请求。例如,您可
以用Activity标记所有的相关请求,并在Activity的onStop()中调用requestQueue.cancelAll(this)取消这些请求。

1.这是一个使用字符串标记的示例:

public static final String TAG = "MyTag";StringRequest stringRequest; // Assume this exists.RequestQueue mRequestQueue;  // Assume this exists.// Set the tag on the request.stringRequest.setTag(TAG);// Add the request to the RequestQueue.mRequestQueue.add(stringRequest);

2.在Activity的onStop()方法中,取消所有具有此标记的请求:

@Overrideprotected void onStop () {    super.onStop();    if (mRequestQueue != null) {        mRequestQueue.cancelAll(this);    }}
原创粉丝点击