Volley的基本使用(1)——http请求

Volley框架有如下特点:

1.Volley是谷歌官方发不的第三方框架

2.使用Volley通信更快更简单

3.Volley中的get、post网络请求以及网络图像显示都是高效的异步处理请求

4.使用对类进行请求的排序

5.Volley可以使网络请求和Activity的生命周期结合起来,使得在活动不可见或者不是运行状态的时候,取消网络请求

6.Volley并不适合用来实现文件的上传和下载

7.Volley实现了高效的get/post方式的数据请求交互

8.Volley实现网络图片的加载和缓存


下面介绍一下使用Volley来实现get和post请求实现方式:

Volley实现get和post请求都有通用的3中方式,他们使用的场合如下:

StringRequest  —— 请求数据返回结果不确定的情况下,它涵盖了后面两种请求对象。

JsonObjectRequest —— 确定返回的数据是JsonObject类型的话,那么久使用这个

JsonArrayRequest ——当确定返回数据是JsonAray的话,那么就使用这个

想要实现Volley与Activity生命周期的联动,那么要为上面的请求对象设置tag,然后在Activity中的onStop方法中取消请求。


Volley使用的步骤:

1.创建工程之后新建一个类,继承Application类,这里初始化请求队列并提供获取队列的静态方法:

import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;

import android.app.Application;

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;
	}
}

2.建立好这个类之后,需要在 AndroidManifest.xml文件中加入或修改application标签的name属性:

<application
        android:name="com.raid.volleydemo.MyApplication" >
</application>

3.然后就可以进行各种请求操作了。

Get请求的实现:

1.使用StringRequest 实现方法如下:

/**
     * 使用StringRequest对象进行get请求
     * @param url 请求网站资源的地址
     */
    private void string_request(String url) {
        //取消
        MyApplication.getHttpQueues().cancelAll(tag);
        StringRequest request = new StringRequest(Method.GET, url, new Listener<String>() {

            /**
             * 请求成功之后回调的方法,arg0为服务器返回的内容
             */
            @Override
            public void onResponse(String arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, arg0, Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            
            /**
             * 请求失败时回调的方法
             */
            @Override
            public void onErrorResponse(VolleyError arg0) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
            }
        });
        //设置Tag,为了在Activity的onStop方法中通过这个tag来停止请求
        request.setTag("GET_STRING_REQUEST");
        //把请求加入到请求队列中
        MyApplication.getHttpQueues().add(request);
        //开启请求队列请求
        MyApplication.getHttpQueues().start();
    }

在设置好Tag之后,MainActivity中需要重写onStop方法停止请求:


/**
* 在onStop方法中撤销请求队列中的所有Tag对应的请求
 */
@Override
protected void onStop() {
	// TODO Auto-generated method stub
	super.onStop();
	MyApplication.getHttpQueues().cancelAll("GET_STRING_REQUEST");
}


2.使用JsonObjectRequest实现方法如下:

/**
	 * 使用JsonObjectRequest对象进行get请求
	 * @param url
	 */
	private void json_object_request(String url) {
		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(), Toast.LENGTH_LONG).show();
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		});
		
		request.setTag("GET_JSONOBJECT_REQUEST");
		MyApplication.getHttpQueues().add(request);
	}
3.使用JsonArrayRequest实现方法如下:

	private void json_array_request(String url) {
		// TODO Auto-generated method stub
		MyApplication.getHttpQueues().cancelAll("abcGet");
		JsonArrayRequest arrRequest = new JsonArrayRequest(url, new Listener<JSONArray>() {

			@Override
			public void onResponse(JSONArray arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		});
		arrRequest.setTag("abcGet");
		MyApplication.getHttpQueues().add(arrRequest);
	}

Post请求的实现:

1.使用StringRequest 实现方法如下:

/**
	 * 使用字符串的形式发送post请求,返回的也是字符串
	 */
	private void post_string_request() {
		String url = "http://192.168.150.1/MyServer/volleydemo2.php";
		StringRequest request = new StringRequest(Method.POST, url, new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0, Toast.LENGTH_LONG).show();
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		}) {
			/**
			 * 必须要实现这个方法,这个方法用来设置请求的数据
			 */
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				// TODO Auto-generated method stub
				Map<String, String> hashMap = new HashMap<String, String>();
				hashMap.put("val1", "value1");
				hashMap.put("val2", "value2");
				return hashMap;
			}
		};
		request.setTag("abcPost");
		MyApplication.getHttpQueues().add(request);
	}

2.使用JsonObjectRequest实现方法如下

注意,这种方式如果是PHP的Apache服务器来接收的话就会报错,原因是因为JSONObject封装的时候多出了一个BOM头,但是我查了JSONObject源码发现android4.0以上的API以及对这个头进行处理了,所以现在还是不知道是什么原因~~所以如果服务器是Apache+PHP的时候,就不要使用这个方法了,报错信息如下图:

实现代码如下:

/**
	 * 使用JsonObjectRequest的方式进行post请求,但是这种请求在php服务器上是会解析错误的,错误没解决~
	 */
	private void post_json_object_request() {
		// TODO Auto-generated method stub
		String url = "http://192.168.150.1/MyServer/volleydemo3.php";
		/**
		 * 创建Map对象,里面存放post请求的数据,并用这个map去构造JSONObject
		 */
		Map<String, String> map = new HashMap<String, String>();
		map.put("val1", "value1");
		map.put("val2", "value2");
		JSONObject object = new JSONObject(map);
		JsonObjectRequest objectRequest = new JsonObjectRequest(Method.POST, url, object, new Listener<JSONObject>() {
			/**
			 * 请求成功时返回的JSON对象
			 */
			@Override
			public void onResponse(JSONObject arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		}, new ErrorListener() {

			/**
			 * 请求失败的时候返回的错误信息
			 */
			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		});
		//设置tag
		objectRequest.setTag("abcPost");
		//把请求加入队列
		MyApplication.getHttpQueues().add(objectRequest);
	}
3.使用JsonArrayRequest实现方法如下,( Apache+PHP就可以使用JsonArrayRequest发送请求,这个类是可以成功接收到服务器返回的信息的):

private void post_json_array_request() {
		// TODO Auto-generated method stub
		MyApplication.getHttpQueues().cancelAll("abcPost");
		String url = "http://192.168.150.1/MyServer/volleydemo3.php";
		JsonArrayRequest arrRequest = new JsonArrayRequest(url, new Listener<JSONArray>() {

			@Override
			public void onResponse(JSONArray arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		}) {
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				// TODO Auto-generated method stub
				Map<String, String> hashMap = new HashMap<String, String>();
				hashMap.put("val1", "value1");
				hashMap.put("val2", "value2");
				return hashMap;
			}
		};
		arrRequest.setTag("abcPost");
		MyApplication.getHttpQueues().add(arrRequest);
	}

 

对Volley的二次封装,步骤如下:

1.创建一个抽象类VolleyInterface,里面实现了Listener<String>和ErrorListener两个抽象类,并向外提供接口回调方法:

import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.VolleyError;


public abstract class VolleyInterface {
	//封装了Volley发送请求的两个Listener
	private Listener<String> listener;
	private ErrorListener errorListener;
	public VolleyInterface() {
	}
	//提供抽象方法作为Listener<String>中的回调方法
	public abstract void onMySuccess(String result);
	//提供抽象方法作为ErrorListener中的回调方法
	public abstract void onMyError(VolleyError arg0);
	
	//对外提供获取Listener<String>对象
	public Listener<String> loadingListener() {
		listener = new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				// TODO Auto-generated method stub
				onMySuccess(arg0);
			}
		};
		return listener;
	}
	//对外提供获取ErrorListener对象
	public ErrorListener errorListener() {
		errorListener = new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				// TODO Auto-generated method stub
				onMyError(arg0);
			}
		};
		return errorListener;
	}
}

2.建立二次封装类:

import java.util.Map;

import android.content.Context;

import com.android.volley.AuthFailureError;
import com.android.volley.Request.Method;
import com.android.volley.toolbox.StringRequest;

public class VolleyRequest {
	public static StringRequest stringRequest;
	public static Context context;
	
	/**
	 * 封装get请求
	 * @param context 上下文对象,一般传入MainActivity.this或者getApplicationContext()
	 * @param url 访问服务器的资源地址
	 * @param tag 设置tag
	 * @param vif VolleyInterface对象
	 */
	
	public static void requestGet(Context context, String url, String tag, VolleyInterface vif) {
		//在设置请求的时候先清除一样重复的请求
		MyApplication.getHttpQueues().cancelAll(tag);
		//通过StringRequest创建请求,vif.loadingListener()和vif.errorListener()获取相应的监听器
		stringRequest = new StringRequest(Method.GET, url, vif.loadingListener(), vif.errorListener());
		stringRequest.setTag(tag);
		MyApplication.getHttpQueues().add(stringRequest);
		MyApplication.getHttpQueues().start();
	}
	
	/**
	 * 发送post请求
	 * @param context context 上下文对象,一般传入MainActivity.this或者getApplicationContext()
	 * @param url 访问服务器的资源地址
	 * @param tag 设置tag
	 * @param params 一个Map<String, String>对象,包装了post请求需要发送给服务器的数据
	 * @param vif VolleyInterface对象
	 */
	public static void requestPost(Context context, String url,
			String tag, final Map<String, String> params, VolleyInterface vif) {
		MyApplication.getHttpQueues().cancelAll(tag);
		stringRequest = new StringRequest(url, vif.loadingListener(), vif.errorListener()) {
			@Override
			protected Map<String, String> getParams() throws AuthFailureError {
				// TODO Auto-generated method stub
				return params;
			}
		};
		stringRequest.setTag(tag);
		MyApplication.getHttpQueues().add(stringRequest);
		MyApplication.getHttpQueues().start();
	}

}

3.在实际情况中的使用:

private void custom_string_request(String url) {
		// TODO Auto-generated method stub
		/**
		 * 此时只需要一句代码就可以完成请求,实现VolleyInterface接口中的两个方法
		 */
		VolleyRequest.requestGet(this, url, "abcGet", 
				new VolleyInterface() {
			
			/*
			 * 请求成功时候服务器返回的内容
			 * @see com.raid.volleydemo.VolleyInterface#onMySuccess(java.lang.String)
			 */
			@Override
			public void onMySuccess(String result) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
			}
			
			/*
			 * 请求失败时返回的错误信息
			 * @see com.raid.volleydemo.VolleyInterface#onMyError(com.android.volley.VolleyError)
			 */
			@Override
			public void onMyError(VolleyError arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(MainActivity.this, arg0.toString(), Toast.LENGTH_LONG).show();
			}
		});
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值