最近闲来想看看android网络方面的东西。google在2013年发布了一个叫做Volley的网络请求框架,我看了一下官网,居然在training里面就有教程。首先,英文的东西看着

还是挺不爽的,特此翻译一下,正好自己也学习一下, 可能最后有时间也会去研究一下它的源码是怎么写的。下面开始:

第一回:发送一个简单的请求

当你用Volley的时候,你的流程分为几步:

1、你会创建一个RequestQueue并且传给它一个Request对象。

2、之后这个RequestQueue就会组织一些工作线程(奴隶?)来运行这个网络请求操作。

3、请求完成之后写入cache并解析这个返回的结果。Request的工作是解析这个原始的返回,Volley关心的是怎么把这些返回的数据传送到你的主线程。

这一回课将会叫你怎样通过通过Volley.newRequestQueue这个方便的方法来发送一个请求,这个方法会为你自动创建一个RequestQueue。如果想要知道怎么自定义一个RequestQueue

请看Volley使用指南第二回。下面我们来看看怎样在RequestQueue里面添加一个request和怎样取消一个request

第一步。首先,你要把android网络权限打开,把android.permission.INTERNET添加到你的mainifest文件里面。

第二步。

使用newRequestQueue:

Volley提供了一个方便的方法叫做Volley.newRequestQueue,它可以为你自动创建一个RequestQueue,那么它使用的是默认参数启动这个queue,举个栗子:

 final TextView mTextView = (TextView) findViewById(R.id.text);
... // Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.baidu.com"; // Request a string response from the provided 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!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);

那么google被墙,测试网站就用百度。Volley做的工作是把解析好的response发给主线程。在主线程里面使用接收到的数据填充UI是很容易的,因为你可以很轻松地使用handler

改变你的UI,但这对于这个框架的其他语法来说是相当危险的, 比如说取消操作。

第三步。发送一个请求。

要发送请求,你首先要构造一个用add()方法把它添加到RequestQueue里面。当你把它add进去了以后,它就会通过一个类似于管道的东西,之后得到执行,把获取到的东西

解析出来然后传递到主线程。当你调用call()方法的时候,Volley会启动一个缓存线程和一些网络分发线程。当你添加一个request,它会被cache线程识别和筛选,过程是:

如果你的request能够被cache所服务(已经缓存),那么它就会被cache线程解析并发送到主线程。如果没有被缓存,执行以下几步:

1、就把它加入网络请求的队列。

2、第一个可用的网络线程从RequestQueue中接到这个工作,执行http请求。

3、在worker thread里面解析这个请求

4、把解析好的数据写入cache。

5、最后把数据发送到主线程。

下面是这一过程的生命周期图:

第四步。取消一个请求

要取消一个请求,在你的Request对象上调用cancal()方法。一旦取消请求,Volley就一定不会执行response handler。你可以在onStop()方法里面把即将发出的请求取消掉,

这样你就不用处理一团乱的response handlers问题,无论对于onSaveInstanceState()已经被调用还是其他问题。

如果你想利用好这个特性,你要给每个执行中的request打上一个标记以便在必要的时候取消它们。有一个简单的方法可以做到这一点:你可以为你的request对象和一个tag对象

做一个联系,然后你可以利用这些标记取消请求。举个栗子:你可以为你的Activity所有的request都打上标签,然后在onStop()方法调用requestQueue.cancelAll(this)。

同样的,你可以为viewPager里面的图片请求打上标签并在适当的时间取消请求,以便在滑动标签的时候,下一个标签页不会因为上一个标签页的图片请求未完成而挂起。

下面是一个使用string 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);
 @Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}

当你在取消请求的时候要当心。如果你使用response handler去推进一个状态或者是启动另外一个进程,你要为此负责。再说一遍,一旦取消,response handler就不会执行。

Volley使用指南第一回(来自developer.android)的更多相关文章

  1. Volley使用指南第三回(来自developer.android)

    继第二篇之后,再来Volley使用的教程的第三篇,有些翻译我是根据自己的理解,可能有错误的地方,还请多多包涵. 标准请求 这一回课将会告诉你Volley能够完成的3种请求类型 1.StringReqe ...

  2. Volley使用指南第二回(来自developer.android)

    上一篇文章翻译了一下google的Volley官方文档,讲到了最基本的发送request.这一次我们来下一回:创建一个自定义RequestQueue. 这篇文章将会教你一步一步创建自己的Request ...

  3. Volley使用指南第四回(来自developer.android)

    Volley网络请求的第四篇,废话不多说,开始. 这一篇文章将会教你怎样在Volley支持的范围内定制一个请求. 第一步:写一个通用请求: 大多数请求都有已经写好的接口供你调用,如果你的请求是Stri ...

  4. 傲娇Android二三事之操蛋的开发日记(第一回)

    武宗元年 十一月初四 霾 今日魔都,依旧仙雾环绕,仿佛蓬莱落凡尘.望着470这个鲜红的AQI修仙指数,贫道不禁吟道,“正是修仙好光景,雾霾时节又逢君”.但在这个只修bug,不修仙的时代,路上的行人都步 ...

  5. [翻译]现代java开发指南 第一部分

    现代java开发指南 第一部分 第一部分:Java已不是你父亲那一代的样子 第一部分,第二部分 =================== 与历史上任何其他的语言相比,这里要排除c语言和cobol语言,现 ...

  6. 【转帖】Mysql多维数据仓库指南 第一篇 第1章

     Mysql多维数据仓库指南 第一篇基本原理 章节列表: 第1章:基本组成 第2章:维度历史 第3章:维度可加性 第4章:维度查询 本篇概述 你将运用关系数据库来实施一个维度数据仓库.事实表和维表这两 ...

  7. developer.android.google.cn

    Android Studio官方 Android IDE https://developer.android.google.cn/studio/index.html 探索 Android Studio ...

  8. NFC Basics(基本NFC)——翻译自developer.android.com

    NFC Basics 关于收发NDEF格式的消息,以及相关的api. 非NDEFdata以及其它更深入技术请參见Advanced NFC. 在android端使用NDEF有两种情况: - 从标签读取N ...

  9. PADSPCB权威指南-第一章 PADS软件系统(部分)(原创)

    PADSPCB权威指南-第一章(部分)豆丁地址:http://www.docin.com/p-707128286.html

随机推荐

  1. HTML5体验改进的14条军规

    来自公园<HTML5——用新方式创造更好的用户体验>线下活动中来自火速轻应用的技术总监胡敏东的分享.   1. fake 页 - 首屏加速 目标:首屏 3s 以内   因为 71% 的用户 ...

  2. 综合使用spring cloud技术实现微服务应用

    在之前的章节,我们已经实现了配置服务器.注册服务器.微服务服务端,实现了服务注册与发现.这一章将实现微服务的客户端,以及联调.实现整个spring cloud框架核心应用. 本文属于<7天学会s ...

  3. Hibernate的CRUD

    1.CRUD: C:sesion.save() R:session.get()? session.load() D:session.delete() U:session.update() 2.读取数据 ...

  4. [UVA] 11995 - I Can Guess the Data Structure! [STL应用]

    11995 - I Can Guess the Data Structure! Time limit: 1.000 seconds Problem I I Can Guess the Data Str ...

  5. angular中的等号(==)判定

    使用angularjs的时候会使用到其中的表达式,其中有相等的判断.由于js有==和===的区别,于是就想看看是否相同.自己稍微做了一点测试,一看便知. 先给结论:angularjs表达式中的==和= ...

  6. Python入门 - 函数方法

    本节主讲python函数的基本用法,主要包括传递参数.匿名函数和变量作用域. 一.传递参数 python除了传递必需参数外,还可以传递默认参数,不定长参数和关键字参数. 1. 传递必需参数 def m ...

  7. Mybatis面试题整理(超详细)

    1.什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动.创建连接.创建statement ...

  8. Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程

    需求 最近用 Inno Setup 做一个exe,可是在安装之前要停止正在运行的相应进程或者在卸载之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,最后经过度娘的耐心帮助下终于在网上找到 ...

  9. php优秀框架codeigniter学习系列——前言

    php的框架众多,笔者用过的包括thinkphp,CI,smarty,laravel,也用过一些公司自己开发的框架. thinkphp是国人自己开发的,我大概用过一段时间,基本功能都还好,应该也还比较 ...

  10. List转数组

    eg: List<Product> products = new ArrayList<Product>(); Product[] array = products.toArra ...