Android-volley框架学习笔记

一、简介

       Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架。

二、优缺点

       1、优点:

             与其他框架相比通信更快、更简单

             JSON,图像等的异步下载;

             网络请求的排序(scheduling)

             网络请求的优先级处理

             多级别取消请求

             和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)

              Get、Post网络请求及网络图像的高效率异步处理请求

              网络请求的缓存

       2、缺点:

              在文件上传方便做的不够好(可以选择其他框架,比如android-async-http、retrofit、okhttp)

三、功能特点

       1、扩展性强。Volley 中大多是基于接口的设计,可配置性强。

       2、一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。

       3、默认 Android2.3 及以上基于 HttpURLConnection,2.3以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。

       4、提供简便的图片加载工具。

四、请求对象

       1、StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener) ;

       2、JsonObjectRequest(int method, String url, JSONObject jsonRequest,Listener<JSONObject> listener,ErrorListener errorListener) ;

       3、JsonArrayRequest(String url, Listener<JSONArray>listener,ErrorListener errorListener);

五、Volley与Activity生命周期的联动

       1、特点:

              可以在Activity销毁时候,同时关闭请求

       2、关键点:

              设置Tag标签,在onStop()里面执行取消请求

六、Volley的简单而且回调封装

优势:全局使用一个方式,可控,可自定义定制需求

七、例子1(请求数据):

      1、创建一个安卓项目,添加volley的jar包。网上参考下载地址http://download.csdn.net/detail/inquisitive_plus/8488223

       2、创建一个MyApplication类继承Application,把RequestQueue放到全局变量里面,目的是方便获取RequestQueue对象:

public class MyApplication extends Application{
	public static RequestQueue queues;
	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		queues = Volley.newRequestQueue(getApplicationContext());
	}
	public static RequestQueue getHttpQueues(){
		return queues;
	}
}

3、MainActivity.java的主要内容是:

package com.example.volleydemo;
import java.util.HashMap;
import java.util.Map;
import org.json.JSONObject;
import com.android.volley.Request.Method;
import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	public TextView tv;
	// 这是测试的URL,返回的json提示错误的请求KEY!,因为我还没有注册,这里说明我们可以正常获取json
	public String url = "http://apis.juhe.cn/ip/ip2addr?ip=www.juhe.cn&key=appkey";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
	}
	@Override
	protected void onStop() {
		super.onStop();
		MyApplication.getHttpQueues().cancelAll("myTest");
	}
	/** 通过点击界面的按钮来查看信息 */
	public void test1(View v) {
		volleyGetByJO();
	}
	public void test2(View v) {
		volleyGetByStr();
	}
	public void test3(View v) {
		volleyPostByJO();
	}
	public void test4(View v) {
		volleyPostByStr();
	}
	public void volleyGetByJO() {
		/**
		 * 关于url,这是你要访问的链接,你可以在本机上创建一个web工程(比如名称为AndroidWeb),
		 * 在新建一个Servlet或者html文件,查看本机ip地址(比如172.16.41.155) 然后url就可以这么写了
		 * http://172.16.41.155/AndroidWeb/index.html
		 * 注意:这样访问的话,手机和电脑需要在同一个网段(即ip地址都是172.16.41.*),可以让电脑和手机连接同一个wifi,或者电脑发射wifi让手机连接。
		 * 启动tomcat
		 */

		/**
		 * JsonObjectRequest(int method, String url, JSONObject jsonRequest,Listener<JSONObject> listener,ErrorListener errorListener) 
		 * 参数method:请求方式
		 * 参数url:请求地址
		 * 参数jsonRequest:请求所携带的json数据
		 * 参数listener :请求成功回调
		 * 参数errorListener:请求失败回调
		 * return值:JsonObjectRequest
		 */
		JsonObjectRequest request = new JsonObjectRequest(Method.GET, url,
				null, new Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject arg0) {
						// TODO Auto-generated method stub
						Toast.makeText(MainActivity.this,
								"请求成功,返回的参数:" + arg0.toString(), 0).show();
						tv.setText("");
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError arg0) {
						// TODO Auto-generated method stub
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
						tv.setText("");
					}
				});
		request.setTag("myTest");
		MyApplication.getHttpQueues().add(request);
	}

	public void volleyGetByStr() {
		/**
		 * StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener) 
		 * 参数method:请求方式
		 * 参数url:请求地址
		 * 参数listener:请求结束后回调
		 * 参数errorListener:请求出错回调
		 * return值 :StringRequest
		 */
		StringRequest request = new StringRequest(Method.GET, url,
				new Listener<String>() {
					@Override
					public void onResponse(String arg0) {
						// TODO Auto-generated method stub
						Toast.makeText(MainActivity.this,
								"访问成功,返回的参数是:" + arg0, 0).show();
						tv.setText("");
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError arg0) {
						// TODO Auto-generated method stub
						Toast.makeText(MainActivity.this, arg0.toString(), 0)
								.show();
						tv.setText("");
					}
				});
		// 设置请求标签
		request.setTag("myTest");
		// 把请求添加到队列里面
		MyApplication.getHttpQueues().add(request);
	}

	public void volleyPostByJO() {
		Map<String, String> map = new HashMap<String, String>();
		map.put("key1", "value1");
		map.put("key2", "value2");
		JSONObject jsonObj = new JSONObject(map);
		JsonObjectRequest request = new JsonObjectRequest(Method.POST, url,
				jsonObj, new Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject arg0) {
						tv.setText("post请求回来的JsonObjectRequest的信息:\n"
								+ arg0.toString());
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError arg0) {
						tv.setText("post请求回来的JsonObjectRequest的出错信息:\n"
								+ arg0.toString());
					}
				});
		request.setTag("myTest");
		MyApplication.getHttpQueues().add(request);
	}

	public void volleyPostByStr() {
		StringRequest request = new StringRequest(Method.POST, url,
				new Listener<String>() {
					@Override
					public void onResponse(String arg0) {
						tv.setText("post请求回来的StringRequest的信息:\n" + arg0);
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError arg0) {
						tv.setText("post请求回来的StringRequest的出错信息:\n"
								+ arg0.toString());
					}
				}) {
			/** 这是StringRequest匿名内部类,实现getParams方法 */
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				Map<String, String> hashMap = new HashMap<String, String>();
				hashMap.put("mytest", "这是post请求的参数");
				return super.getParams();
			}
		};
		request.setTag("myTest");
		MyApplication.getHttpQueues().add(request);
	}
	
	public void volleyGetByArr(){
		//API:JsonArrayRequest(String url, Listener<JSONArray> listener,ErrorListener errorListener)
		//JsonArrayRequest request = new JsonArrayRequest(url, listener, errorListener);
	}
	
	public void volleyPostByArr(){	<pre name="code" class="java"><span style="white-space:pre">		</span>//API:JsonArrayRequest(String url, Listener<JSONArray> listener,ErrorListener errorListener)
		//JsonArrayRequest request = new JsonArrayRequest(url, listener, errorListener);
}}

 

       小结:post和get请求最大的区别就是参数,post提交的参数不会显示在地址栏,get提交的参数显示在地址栏,所以用post请求时,参数要放到map里面再提交;用get请求时可以把参数直接附加到地址里面。

        源码下载:http://download.csdn.net/detail/sq_bang/9555679

八、例子2(请求图片)
       1、开发过程和例子1差不多,这里就不再详细说了,直接看源码吧。

       2、源码下载 :http://download.csdn.net/detail/sq_bang/9555687


学习资料:

1、http://www.kuqin.com/shuoit/20150908/347925.html

2、http://blog.csdn.net/cym492224103/article/details/38677063


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值