一、简介
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