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的时候,就不要使用这个方法了,报错信息如下图:

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

实现代码如下:

/**
* 使用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();
}
});
}