(点击
上方公众号
,可快速关注)
来源:刘望舒
链接:blog.csdn.net/itachi85/article/details/51043704
前言
Volley想必很多人都用过,为了建立网络编程的知识体系,Volley是必须要讲的知识点,所以我这里有必要再次介绍一下Volley的使用。
1.Volley简介
在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。在使用Volley前请下载Volley库并放在libs目录下并add到工程中。
2.Volley网络请求队列
Volley请求网络都是基于请求队列的,开发者只要把请求放在请求队列中就可以了,请求队列会依次进行请求,一般情况下,一个应用程序如果网络请求没有特别频繁则完全可以只有一个请求队列(对应Application),如果非常多或其他情况,则可以是一个Activity对应一个网络请求队列,这就要看具体情况了,首先创建队列:
RequestQueue
mQueue
=
Volley
.
newRequestQueue
(
getApplicationContext
());
3.StringRequest的用法
StringRequest返回的数据是String类型的,我们查看下StringRequest的源码:
public
class
StringRequest
extends
Request
{
private
final
Listener
mListener
;
public
StringRequest
(
int
method
,
String
url
,
Listener
listener
,
ErrorListener
errorListener
)
{
super
(
method
,
url
,
errorListener
);
this
.
mListener
=
listener
;
}
public
StringRequest
(
String
url
,
Listener
listener
,
ErrorListener
errorListener
)
{
this
(
0
,
url
,
listener
,
errorListener
);
}
...
省略
}
有两个构造函数,其中第一个比第二个多了一个请求的方法,如果采用第二个则默认是GET请求。好了,我们试着用GET方法来请求百度:
//创建请求队列
RequestQueue
mQueue
=
Volley
.
newRequestQueue
(
getApplicationContext
());
StringRequest
mStringRequest
=
new
StringRequest
(
Request
.
Method
.
GET
,
"http://www.baidu.com"
,
new
Response
.
Listener
()
{
@Override
public
void
onResponse
(
String
response
)
{
Log
.
i
(
"wangshu"
,
response
);
}
},
new
Response
.
ErrorListener
()
{
@Override
public
void
onErrorResponse
(
VolleyError
error
)
{
Log
.
e
(
"wangshu"
,
error
.
getMessage
(),
error
);
}
});
//将请求添加在请求队列中
mQueue
.
add
(
mStringRequest
);
当然别忘了添加网络访问权限:
uses
-
permission
android
:
name
=
"android.permission.INTERNET"
/>
|
请求结果不用说是百度界面的html文件:
4.JsonRequest的用法
和StringRequest类似,我们直接上代码:
RequestQueue
mQueue
=
Volley
.
newRequestQueue
(
getApplicationContext
());
JsonObjectRequest
mJsonObjectRequest
=
new
JsonObjectRequest
(
Request
.
Method
.
POST
,
"http://api.1-blog.com/biz/bizserver/article/list.do"
,
new
Response
.
Listener
()
{
@Override
public
void
onResponse
(
JSONObject
response
)
{
Log
.
d
(
"wangshu"
,
response
.
toString
());
}
},
new
Response
.
ErrorListener
()
{
@Override
public
void
onErrorResponse
(
VolleyError
error
)
{
Log
.
e
(
"wangshu"
,
error
.
getMessage
(),
error
);
}
}
);
mQueue
.
add
(
mJsonObjectRequest
);
运行程序返回的是一堆新闻的Json数据:
为了解析这些Json数据,我们用Gson来解析Json数据。下载Gson将jar包放在libs目录下并add进工程中。我们开始写article类用于存储数据:
public
class
Article
{
private
String
desc
;
private
String
status
;
private
List
detail
=
new
ArrayList
();
public
List
Article
.
detail
>
getDetail
()
{
return
detail
;
}
public
void
setDetail
(
List
Article
.
detail
>
detail
)
{
this
.
detail
=
detail
;
}
public
String
getDesc
()
{
return
desc
;
}
public
void
setDesc
(
String
desc
)
{
this
.
desc
=
desc
;
}
public
String
getStatus
()
{
return
status
;
}
public
void
setStatus
(
String
status
)
{
this
.
status
=
status
;
}
public
class
detail
{
private
String
title
;
private
String
article_url
;
private
String
my_abstract
;
private
String
article_type
;
public
String
getTitle
()
{
return
title
;
}
public
void
setTitle
(
String
title
)
{
this
.
title
=
title
;
}
public
String
getArticle_url
()
{
return
article_url
;
}
public
void
setArticle_url
(
String
article_url
)
{
this
.
article_url
=
article_url
;
}
public
String
getMy_abstract
()
{
return
my_abstract
;
}
public
void
setMy_abstract
(
String
my_abstract
)
{
this
.
my_abstract
=
my_abstract
;
}
public
String
getArticle_type
()
{
return
article_type
;
}
public
void
setArticle_type
(
String
article_type
)
{
this
.
article_type
=
article_type
;
}
}
}
最后我们改写JsonRequest的请求回调:
RequestQueue
mQueue
=
Volley
.
newRequestQueue
(
getApplicationContext
());
JsonObjectRequest
mJsonObjectRequest
=
new
JsonObjectRequest
(
Request
.
Method
.
POST
,
"http://api.1-blog.com/biz/bizserver/article/list.do"
,
new
Response
.
Listener
()
{
@Override
public
void
onResponse
(
JSONObject
response
)
{
Article
mArticle
=
new
Gson
().
fromJson
(
response
.
toString
(),
Article
.
class
);
List
Article
.
detail
>
mList
=
mArticle
.
getDetail
();
String
title
=
mList
.
get
(
0
).
getTitle
();
Log
.
d
(
"wangshu"
,
title
);
}
},
new
Response
.
ErrorListener
()
{
@Override
public
void
onErrorResponse
(
VolleyError
error
)
{
Log
.
e
(
"wangshu"
,
error
.
getMessage
(),
error
);
}
}
);
mQueue
.
add
(
mJsonObjectRequest
);
来看看打印结果:
5.使用ImageRequest加载图片
ImageRequest已经是过时的方法了,和前面两种的用法类似:
RequestQueue
mQueue
=
Volley
.
newRequestQueue
(
getApplicationContext
());
ImageRequest
imageRequest
=
new
ImageRequest
(
"http://img.my.csdn.net/uploads/201603/26/1458988468_5804.jpg"
,
new
Response
.
Listener
()
{
@Override
public
void
onResponse
(
Bitmap
response
)
{
iv_image
.
setImageBitmap
(
response
);
}
},
0
,
0
,
Bitmap
.
Config
.
RGB_565
,
new
Response
.
ErrorListener
()
{
@Override
public
void
onErrorResponse
(
VolleyError
error
)
{
iv_image
.
setImageResource
(
R
.
drawable
.
ico_default
);
}
});
mQueue
.
add
(
imageRequest
);
查看ImageRequest的源码发现它可以设置你想要的图片的最大宽度和高度,在加载图片时如果图片超过期望的最大宽度和高度则会进行压缩:
public
ImageRequest
(
String
url
,
Listener
listener
,
int
maxWidth
,
int
maxHeight
,
ScaleType
scaleType
,
Config
decodeConfig
,
ErrorListener
errorListener