什么是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
不过,因为一些原因,你可能无法访问上述地址。
那么您也可以从以下地址下载:
http://download.csdn.net/detail/u011213647/7412215
使用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中添加必要的权限
<uses-permission android:name="android.permission.INTERNET" />
在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<String>() { @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<String>() { @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<Bitmap>() { @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访问多张图片,并在本地作图片缓存,以及如何取消数据请求。