Android Volley 发送一个简单的请求

可以通过创建一个RequestQueue并传递Request对象来使用Volley。RequestQueue管理工作线程,这些线程用于运行网络操作、读取和写入缓存和解析响应。Request对原始响应进行解析,并且Volley负责将已解析的响应分派回主线程。

本文介绍如何使用Volley.newRequestQueue的便捷方法发送请求,该方法为您这是了一个RequestQueue。本文还介绍了如何向RequestQueue添加请求和取消请求。

添加INTERNET权限

使用Volley,需要将android.permission.INTERNET权限添加到app的清单文件中。否则app将不能连接网络。

使用 newRequestQueue

Volley提供了一个便捷的方法Volley.newRequestQueue,它使用默认值创建一个RequestQueue,并启动队列。例如:

1final TextView mTextView = (TextView) findViewById(R.id.text); 2... 3 4// Instantiate the RequestQueue. 5RequestQueue queue = Volley.newRequestQueue(this); 6String url ="http://www.google.com"; 7 8// Request a string response from the provided URL. 9StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 10 new Response.Listener<String>() { 11 @Override 12 public void onResponse(String response) { 13 // Display the first 500 characters of the response string. 14 mTextView.setText("Response is: "+ response.substring(0,500)); 15 } 16}, new Response.ErrorListener() { 17 @Override 18 public void onErrorResponse(VolleyError error) { 19 mTextView.setText("That didn't work!"); 20 } 21}); 22// Add the request to the RequestQueue. 23queue.add(stringRequest);

Volley总是在主线程上提解析响应。在主线程上运行可以方便的使用接收到的数据填充UI控件,因此可以直接从响应的处理程序中自由的修改UI控件。同时这对于本库提供的许多主要特性也很重要,特别是与取消请求有关。

发送请求

要发送一个请求,只需要构建一个请求,并使用RequestQueue的add()方法将其添加到RequestQueue中,如上所示。一旦添加了一个请求,它通过管道移动、得到服务,并拥有自己的已投递和解析的响应。

当调用add()时,Vollley运行一个缓存处理线程和一个网络调度线程池。当向队列添加请求时,它由缓存线程拾取并分类:如果请求可以被缓存处理,那么缓存响应就在缓存线程中被解析并且解析后的响应被传递到主线程。如果请求不能被缓存处理,他被放置在网络队列中。第一个有效的网络线程从队列中获取请求,执行HTTP事务,并在工作线程中解析响应,将响应写入缓存,然后将解析过的响应送回主线程被传递。

请注意,耗时操作(如阻塞I/O和解析/解码)是在工作线程上完成的。可以在任何线程中添加请求,但是响应始终在主线程上传递。 输入图片说明

要取消一个请求,需要在Request对象上调用cancel()。一旦被取消,Volley保证响应处理程序永远不会被调用。这在实践中意味着可以在activity的onStop()方法中取消所有待处理的请求并且不必在响应处理程序中检查getActivity()==null。

要利用此行为,您通常必须跟踪所有正在运行的请求,以便能够在适当的时间取消它们。有一个更简单的方法:可以将标记对象与每个请求相关联。然后,可以使用此标签来提供要取消的请求范围。例如,可以标记Activity中的所有请求,并在onStop()中调用requestQueue.cancelAll(this)。同样,可以使用相应的标签标记ViewPager一个标签中的所有缩略图请求,并在滑动时取消这些request以确保新标签不被另一个标签的请求阻塞。

下面是使用字符串标签的例子:

  1. 定义tag并将其添加给请求。

    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()方法中,取消有此标签的所有请求。

    @Override protected void onStop () { super.onStop(); if (mRequestQueue != null) { mRequestQueue.cancelAll(TAG); } }

取消请求时请小心。如果您依赖于您的响应处理程序来推进状态或启动另一个进程,则需要考虑这一点。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

一篇文章带你了解JavaScript日期

日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用

Android Volley 发送一个简单的请求 - HelloWorld