android通信框架volley详解(一)

什么是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访问多张图片,并在本地作图片缓存,以及如何取消数据请求。

你可能感兴趣的:(android,Volley,网络访问)