Android就业面试技巧系列-技术篇(Volley框架)
Volley简介:
比较流行的http开发库。也封装这个线程。
1.使用底层代码来写http请求 代码量比较大。httpclient j2se httpURLConnection AscynHttpClient
2.高频率http请求 优势在处理数据量比较小的频率高的请求。
3.劣势 大文件的请求。大文件的上传和下载。
1.使用底层代码来写http请求 代码量比较大。httpclient j2se httpURLConnection AscynHttpClient
2.高频率http请求 优势在处理数据量比较小的频率高的请求。
3.劣势 大文件的请求。大文件的上传和下载。
环境搭建:
1.创建一个工程
2.配置权限 Inernet
<!--联网权限-->
<uses-permission android:name="android.permission.INTERNET" />
3.添加jar同时绑定源代码
dependencies {
compile 'com.mcxiaoke.volley:library:1.0.19'
2.配置权限 Inernet
<!--联网权限-->
<uses-permission android:name="android.permission.INTERNET" />
3.添加jar同时绑定源代码
dependencies {
compile 'com.mcxiaoke.volley:library:1.0.19'
RequestQueue:
RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。建议在Application子类中创建。
一.创建在Application http.itheima.com.http_volley.VolleyApplication
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
public
class
VolleyApplication
extends
Application{
//只要有一个组件启动就可执行onCreate
private
RequestQueue requestQueue;
//提供get获取方法
public
RequestQueue getInstance()
{
return
requestQueue;
}
@Override
public
void
onCreate() {
super
.onCreate();
//创建一个核心类
requestQueue = Volley.newRequestQueue(
this
);
//参1.Context上下文
}
}
|
二.在功能清单里面配置 src/main/AndroidManifest.xml
<application
android:name="http.itheima.com.http_volley.VolleyApplication"
android:name="http.itheima.com.http_volley.VolleyApplication"
三 .提供get该法给其它的页面使用。 http.itheima.com.http_volley.MainActivity
[Java]
纯文本查看
复制代码
1
2
3
4
5
|
//获取应用上下文
VolleyApplication application= (VolleyApplication)
this
.getApplication();
//返回请求队表
RequestQueue queue=application.getInstance();
Log.i(
"MainActivity"
,queue+
""
);
|
案例1:
Request.Method volley的请求方式 常用的有get post
Response.Listener volley通过注册监听器获取服务端返回的数据 (成功时候返回的数据)
Response.ErrorListener 网络可能出现异常。volley也通过监听器处理网络异常(失败时候返回的数据)
StringRequest volley提供的http请求对象的封装。如果你要发送一个请求只需要创建Request的实现类的实例。
Response.Listener volley通过注册监听器获取服务端返回的数据 (成功时候返回的数据)
Response.ErrorListener 网络可能出现异常。volley也通过监听器处理网络异常(失败时候返回的数据)
StringRequest volley提供的http请求对象的封装。如果你要发送一个请求只需要创建Request的实现类的实例。
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
//创建一个请求
String url=
"http://192.168.1.114:8080/webapi//get?username=itheima"
;
//根据返回结果创建请求类型
int
method= Request.Method.GET;
//参1.请求方法 参数2.网络连接的地址 参3.获取数据成功的处理监听器
Response.Listener listener=
new
Response.Listener<String>() {
//
@Override
public
void
onResponse(String response) {
//业务:展示给用户
tvResponseString.setText(response);
}
};
//参4.网络处理失败监听器
Response.ErrorListener errorListener =
new
Response.ErrorListener() {
@Override
public
void
onErrorResponse(VolleyError error) {
//业务:展示组用户网络出错的视图
tvResponseString.setText(
">--< 网络出错了"
+error.getMessage());
}
};
//返回类型为String请求
//Request:代表一个网络请求
// |--StringRequest 结果是一个String
// |--JsonReqeust 结果就是一个json 字符串
// |--JsonArrayRequest 结果是一个json数据组对象
// |--JSONObject 结果就是一个json对象
// |--ImageRequest 结果是一张图片
StringRequest request=
new
StringRequest(method,url,listener,errorListener);
//只需添加请求队列里面由队列自行处理
queue.add(request);
|
案例二:
项目中一般使用它来完成登录 。注册等等。
volley封装代码非常简洁。get post的底层差别是 对请求参数是否进行表单编码。但是在代码上的差异只有两处:
1.参1使用 int method = Request.Method.POST;
2.重写StringRequest的getParams返回表单数据 给底层。
3.不需要处理中文乱码。
volley封装代码非常简洁。get post的底层差别是 对请求参数是否进行表单编码。但是在代码上的差异只有两处:
1.参1使用 int method = Request.Method.POST;
2.重写StringRequest的getParams返回表单数据 给底层。
3.不需要处理中文乱码。
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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
|
final
TextView tvResponseString = (TextView) findViewById(R.id.activity_main_tv_reponse_string);
//获取应用上下文
VolleyApplication application = (VolleyApplication)
this
.getApplication();
//返回请求列表
RequestQueue queue = application.getInstance();
Log.i(
"MainActivity"
, queue +
""
);
String url =
"http://192.168.1.114:8080/webapi/post"
;
//Volley把表单参数存在map
final
HashMap<String, String> params =
new
HashMap<>();
// username=hh&password=123
params.put(
"username"
,
"hh中国"
);
params.put(
"password"
,
"123"
);
//创建String返回类型的请求
//参1.
int
method = Request.Method.POST;
//参2.地址
//参3.
Response.Listener<String> listener =
new
Response.Listener<String>() {
@Override
public
void
onResponse(String response) {
//业务 展示
//{"msg":"成功收到信息","data":"45cefcea-4090-4690-bea4-7351f72cd50d"}
try
{
JSONObject jsonObject =
new
JSONObject(response);
String msg = jsonObject.getString(
"msg"
);
String data = jsonObject.getString(
"data"
);
tvResponseString.setText(msg +
" "
+ data);
}
catch
(JSONException e) {
e.printStackTrace();
}
}
};
//参4
Response.ErrorListener errorListener =
new
Response.ErrorListener() {
@Override
public
void
onErrorResponse(VolleyError error) {
tvResponseString.setText(
"获取数据失败"
);
}
};
StringRequest request =
new
StringRequest(method, url,listener,errorListener){
@Override
protected
Map<String, String> getParams()
throws
AuthFailureError {
// 重写getParams() 方法 把参数放到请求里面
return
params;
//getParams发送请求时把数据取出放入请求里
}
};
//发送
queue.add(request);
|
案例三.请求类型
volley为了满足项目中的常见数据返回类型提供了Request的几个子类
//Request:代表一个网络请求
// |--StringRequest 结果是一个String
// |--JsonReqeust 结果就是一个json 字符串
// |--JsonArrayRequest 结果是一个json数据组对象
// |--JSONObject 结果就是一个json对象
// |--ImageRequest 结果是一张图片 图片框架课
根据服务端返回的数据类型不同来创建上面的几种请求方式 本例中以服务端返回的是String字符串,以创建的是StringRequest 请求
一般请求类型不同Response.Listener传入参数也不同。
//Request:代表一个网络请求
// |--StringRequest 结果是一个String
// |--JsonReqeust 结果就是一个json 字符串
// |--JsonArrayRequest 结果是一个json数据组对象
// |--JSONObject 结果就是一个json对象
// |--ImageRequest 结果是一张图片 图片框架课
根据服务端返回的数据类型不同来创建上面的几种请求方式 本例中以服务端返回的是String字符串,以创建的是StringRequest 请求
一般请求类型不同Response.Listener传入参数也不同。
实现代码:
[Java]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
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
|
final
TextView tvResponseString= (TextView) findViewById(R.id.activity_main_tv_reponse_string);
//获取应用上下文
VolleyApplication application= (VolleyApplication)
this
.getApplication();
//返回请求列表
RequestQueue queue=application.getInstance();
Log.i(
"MainActivity"
,queue+
""
);
//创建一个请求
String url=
"http://192.168.1.114:8080/webapi//get?username=itheima"
;
//根据返回结果创建请求类型
int
method= Request.Method.GET;
//参1.请求方法 参数2.网络连接的地址 参3.获取数据成功的处理监听器
Response.Listener<JSONObject> listener=
new
Response.Listener<JSONObject>() {
//
@Override
public
void
onResponse(JSONObject response) {
//服务端返回的数据
//{"msg":"成功收到信息","data":{"username":"\"黑马\""}}
try
{
String msg= response.getString(
"msg"
);
String username= response.getJSONObject(
"data"
).getString(
"username"
);
//业务:展示给用户
tvResponseString.setText(msg+
" "
+username);
}
catch
(JSONException e) {
e.printStackTrace();
|