什么是volley?
volley是2014年google在I/O大会上推出的,解决android设备中频繁,但数据量不大的网络访问问题的一个开源框架。它的优势:
1.自动调度网络请求,处理并发与缓存。
2.支持取消已经发出的请求,但不适合大量数据请求。
我们将在几篇文章中讨论如下问题:
1.使用volley建立网络访问与请求数据。
2.请求数据缓存与中断网络请求。
3.建立请求队列与标准网络请求。
4.改造volley,创建自定义网络请求。
获取volley
如果你的机器上有安装git工具。你可以从以下地址clone:
git clone https://android.googlesource.com/platform/frameworks/volley
不过,因为一些原因,你可能无法访问上述地址。
那么您也可以从以下地址下载:
使用Eclipse的同学,可以直接解压并导入到Eclipse,并将Volley项目设置为Library。并在你的项目中引入即可。
使用Android Studio则麻烦一点,最简单的办法,则是使用Eclipse将Volley导出为jar库,然后引入Android Studio。
创建一个网络连接
(与指定连接创建一个StringRequest访问,以访问www.baidu.com为例)。
1.新建一个Android项目,新建Activity。(此处略过)
2.创建一个RequestQueue。
3.创建一个StringRequest
4.将StringRequest添加到RequestQueue。
5.在AndroidManifest.xml中添加必要的权限
在MainAcitvity中代码如下:
public class MainActivity extends Activity implements OnClickListener {
private Button btn_string_request;
//请求队列
private RequestQueue requestQueue;
//访问请求
private StringRequest stringRequest;
//请求地址
private static final String STRINGURL = "http://www.baidu.com";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取请求队列
requestQueue = Volley.newRequestQueue(this);
//实现StringRequest请求
stringRequest = new StringRequest(STRINGURL,
new Response.Listener() {
@Override
public void onResponse(String response) {
Log.i("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("TAG", error.getMessage(), error);
}
});
btn_string_request = (Button) findViewById(R.id.btn_string_request);
btn_string_request.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_string_request:
requestQueue.add(stringRequest);//添加StringRequest到请求队列
break;
}
}
}
运行,就可以在logcat中看到百度的返回了,是不是很熟悉的感觉?没错,它返回了百度首页的html代码。
获取Json串的网络访问
下面的例子,我们将发起一个请求Json数据的访问。
其流程与StringRequest大致相同。不同的地方在于,这一次我们创建的请求对象是JsonObjectRequest
代码如下:
public class MainActivity extends Activity implements OnClickListener {
private Button btn_json_request;
//请求队列
private RequestQueue requestQueue;
//访问请求
private JsonObjectRequest jsonObjectRequest;
//请求地址
private static final String JSONURL = "http://m.weather.com.cn/data/101010100.html";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取请求队列
requestQueue = Volley.newRequestQueue(this);
//实现JsonObjectRequest请求,注意这里跟StringRequest略有不同
stringRequest = new StringRequest(JSONURL, null,
new Response.Listener() {
@Override
public void onResponse(String response) {
Log.i("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("TAG", error.getMessage(), error);
}
});
btn_json_request = (Button) findViewById(R.id.btn_json_request);
btn_json_request.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_json_request:
requestQueue.add(jsonObjectRequest);//添加JsonObjectRequest到请求队列
break;
}
}
}
至此,我们便可以请求到来自气象网站的天气信息了。运行,我可以在logcat中看到天气的Json串返回。你有没有发现,使用Volley框架做网络访问要轻松愉快的多。Volley还可以做图片请求,请接着往下看。
获取图片的网络访问
获取网络图片的请求也只是稍有不同,过程则差不多一样
public class MainActivity extends Activity implements OnClickListener {
private Button btn_image_request;
//请求队列
private RequestQueue requestQueue;
//访问请求
private ImageRequest imageRequest;
//请求地址
private static final String IMAGEURL = "http://e.hiphotos.baidu.com/image/pic/item/314e251f95cad1c88b1c422e7d3e6709c93d5117.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取请求队列
requestQueue = Volley.newRequestQueue(this);
//实现ImageRequest请求
imageRequest = new ImageRequest(IMAGEURL,
new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
// TODO Auto-generated method stub
iv_image.setImageBitmap(response);
}
}, 0, 0, null, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
iv_image.setImageResource(R.drawable.ic_launcher);
}
});
btn_image_request = (Button) findViewById(R.id.btn_image_request);
btn_image_request.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_image_request:
requestQueue.add(imageRequest);//添加ImageRequest到请求队列
break;
}
}
自此使用volley访问网络数据的三种方式已经完成。下一篇,我们将讨论如何使用volley访问多张图片,并在本地作图片缓存,以及如何取消数据请求。