volley开源框架的初体验

前言

Http网络数据交互请求是极其重要并且使用很频繁的一个模块,也是最基本的网络编程所需要学习的。网络请求方式的效率和性能直接影响到APP的整体用户体验流畅性,所以学习并掌握一款好的Http请求框架对我们的网络开发非常重要。Http请求在移动网络编程中主要是Get和Post请求接口数据的使用。所以,在学习好基础的Http请求知识后,为了提升开发效率,选择学习使用一款好的Http网络请求框架变得非常的重要。

什么是Volley?汉语译过来就是:齐射; 迸发的意思。可以看出来,Volley特别适合数据量不大但是通信频繁的场景。
Volley是Google I/O 2013上Google官方发布的一款Android平台上的网络通信库。
以前的网络请求,要考虑开启线程、内存泄漏、性能等等复杂的问题。但是Volley框架已经帮我们把这些问题处理好了,对外提供了相应的完善的请求API ,我们只需要按照要求使用即可

Volley框架的特点

  • 能使网络通信更快,更简单,更健壮
  • Get、Post网络请求及网络图像的高效率异步处理请求
  • 可以对网络请求进行排序优先级管理
  • 网络请求的缓存
  • 多级别取消请求
  • 和Activity生命周期的联动(Activity结束时同时取消所有网络请求)
    使用Volley可以简化一些网络通信的开发,当然Volley不适合大数据(largepayloads)和流媒体的网络请求。例如上百兆的文件、视频下载。
  • Volley开源,可以进行定制修改也可以直接使用Jar包的形式。

Volley的用法

  1. Volley的Get和Post请求方式的使用
  2. Volley的网络请求队列建立和取消队列请求
  1. Volley的Get和Post请求方式的使用
    Get和Post用于与服务器间请求和发送数据。
    建立请求首先建立队列,将请求添加到请求队列里。
    然后进行相应的Get和Post请求,请求结果在回调里获取解析。

  2. Volley的网络请求队列建立和取消队列请求
    Volley有自己的请求队列管理机制,可以控制每个请求的建立与取消。非常方便和安全。
    这样也就可以做到随时控制某个请求在什么时候结束,Activity生命周期关联,防止无谓的请求。

Volley的简单测试demo

1.新建一个MyApplication类,继承自Application ,用于返回一个全局的Volley网络请求队列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.xkcoding.volley;
import android.app.Application;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;
/**
* @ClassName: MyApplication
* @Description: 用于生成一个全局的请求队列
* @author Yangkai.Shen
* @date 2016-3-26 上午1:09:10
*
*/
public class MyApplication extends Application {
public static RequestQueue queue;
@Override
public void onCreate() {
super.onCreate();
queue = Volley.newRequestQueue(getApplicationContext());
}
/**
* @Title: getRequestQueue
* @Description: 获取一个全局的请求队列
* @param @return 参数说明
* @return RequestQueue 返回类型
* @throws
*/
public static RequestQueue getRequestQueue() {
return queue;
}
}

2.在MainActivity中编写测试GET与POST请求的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.xkcoding.volley;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
import com.android.volley.Request.Method;
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
/**
* @ClassName: MainActivity
* @Description: 1. Volley的Get和Post请求方式的使用 2. Volley的网络请求队列建立和取消队列请求
* @author Yangkai.Shen
* @date 2016-3-26 上午1:08:27
*
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
volley_Get();
volley_Post();
}
/**
* @Title: volley_Get
* @Description: 测试GET方法
* @param 参数说明
* @return void 返回类型
* @throws
*/
private void volley_Get() {
//测试url为聚合数据的手机归属地查询
String url = "http://apis.juhe.cn/mobile/get?phone=13429667914&key=ebe4429a46cb136bc7fcee57806fe952";
StringRequest request = new StringRequest(Method.GET, url,
new Listener<String>() {
// 成功时回调
@Override
public void onResponse(String arg0) {
Log.i("volley_Get", arg0);
Toast.makeText(getApplicationContext(), arg0,
Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
// 失败时回调
@Override
public void onErrorResponse(VolleyError arg0) {
Toast.makeText(getApplicationContext(), "网络请求失败",
Toast.LENGTH_SHORT).show();
}
});
// 加标签,便于在Activity销毁时,断开网络请求
request.setTag("testGet");
// 将请求放入请求队列
MyApplication.getRequestQueue().add(request);
}
private void volley_Post() {
//测试url为聚合数据的手机归属地查询
String url = "http://apis.juhe.cn/mobile/get?";
StringRequest request = new StringRequest(Method.POST, url,
new Listener<String>() {
// 成功时回调
@Override
public void onResponse(String arg0) {
Log.i("volley_Post", arg0);
Toast.makeText(getApplicationContext(), arg0,
Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
// 失败时回调
@Override
public void onErrorResponse(VolleyError arg0) {
Toast.makeText(getApplicationContext(), "网络请求失败",
Toast.LENGTH_SHORT).show();
}
}) {
// POST请求所附带的请求参数
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String, String> map = new HashMap<String, String>();
map.put("phone", "13429667914");
map.put("key", "ebe4429a46cb136bc7fcee57806fe952");
return map;
}
};
// 加标签,便于在Activity销毁时,断开网络请求
request.setTag("testPost");
// 将请求放入请求队列
MyApplication.getRequestQueue().add(request);
}
@Override
protected void onStop() {
// Activity销毁时取消请求队列列的所有请求,通过Tags找到所有请求
MyApplication.getRequestQueue().cancelAll("testGet");
MyApplication.getRequestQueue().cancelAll("testPost");
super.onStop();
}
}

3.在清单文件AndroidManifest.xml中注册刚刚的MyApplication并添加网络权限

1
<uses-permission android:name="android.permission.INTERNET"/>

4.Ctrl+F11 成功在LogCat中打印出号码信息
LogCat信息

o(╯□╰)o我只要一毛钱的鼓励~~