2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。
有如下优点:
//Volley优点:
//1. 联网请求非常快,在轻量级(图片,字符串)的请求中冠军
//2.自动缓存所有的数据
//3.Volley避开了异步任务,开启子线程
//4开发中轻量级联网使用Volley
1.必须要有请求队列 RequestQueue,类似MessageQueue
请求队列作用: 管理请求 Volley 万箭齐发的作用(一次会发送多个请求)
需要管理者管理发出的请求
2.发起请求 ,StringRequest JsonObjectRequest,JsonArrayRequest ImageRequest
其实就是new一个请求
3.把创建的请求添加到请求队列中
无人驾驶模式 自定联网获取数据,自动缓存
首先在activity_main.xml中添加四个按钮
// 请求字符串
public void btnStringRequest(View view) {
// 2.发起请求
String url = "http://218.244.149.129:9010/api/companylist.php?";
StringRequest stringRequest = new StringRequest(Request.Method.POST, //参数1 请求方式
url //参数2 请求网址
, new Response.Listener() {//联网成功回调
@Override
public void onResponse(String response) {
Log.d("flag", "-------->respnse" + response);
}
}, new Response.ErrorListener() {//联网失败的回调
@Override
public void onErrorResponse(VolleyError error) {
Log.d("flag", "联网失败");
}
}) {//告诉StringRequest参数,跟Handle类似,
// Volley进行POST请求传参的方式
@Override
protected Map getParams() throws AuthFailureError {
HashMap map = new HashMap();
// 向map中传入参数
//industryid=99&name=头条
map.put("industryid", "99");
// 如果多个参数,写法类似,一次添加就可以了
return map;
}
};
// 3.添加请求到RequestQueue中
mRequestQueue.add(stringRequest);
}
//Json请求
public void btnJsonRequest(View view) {
// 2.创建Json请求
//String url = "http://mobile.ximalaya.com/m/category_tag_menu";
String url = "http://my2.chamanhua.com/manhuaapp/remoting/topic/queryTopicList";
//请求参数是JSONObject:object=android
JSONObject json = new JSONObject();
//有了对象以后旧可以添加数据
//对于淘宝类的App,服务器数据,商品数据完全一致
//服务器进行交互时,发的请求参数是JSON格式,服务器比较简单,JSON格式不容易错
//淘宝类的App数据量比较大,服务器要求客户端,格式要严格要求,不容易出错
try {
json.put("object", "android");
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, //请求方式
url,//请求网址
json,//请求的参数,请求参数JSONObject形式的数据 如果是GET请求 第三个参数可以为空
new Response.Listener() {//请求成功回调
@Override
public void onResponse(JSONObject response) {
Toast.makeText(MainActivity.this, "请求数据成功", Toast.LENGTH_LONG).show();
Log.d("flag", "------->" + response.toString());
}
}, new Response.ErrorListener() {//请求失败的回调
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "请求数据失败", Toast.LENGTH_LONG).show();
Log.d("flag", "请求数据失败");
}
});
//3添加到请求队列中
mRequestQueue.add(jsonObjectRequest);
}
//请求图片
public void btnImageRequest(View view) {
//2创建ImageRequest
ImageRequest imageRequest = new ImageRequest(mUrl,
new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
if (response != null) {
mImageView.setImageBitmap(response);
} else {
mImageView.setImageResource(R.mipmap.ic_launcher);
}
}
}, 300,//参数3请求回来的图片设置大小 宽,当宽度或者高度超过网络图片的大小,那么这个设置旧没意义
300,//参数4 高
ImageView.ScaleType.FIT_XY,//匹配设备的宽高
Bitmap.Config.RGB_565,//图片的decode规格
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show();
}
});
//3 添加到请求队列中
// 设置TAG
imageRequest.setTag("image");
Request request = mRequestQueue.add(imageRequest);
// 设置是否进行缓存 false不进行缓存
request.setShouldCache(false);
// 取消联网请求图片
mRequestQueue.cancelAll("image");
}
//缓存数据
public void btnGetCacheData(View view) {
//管理者RequestQueue
// 1.获取缓存的对象
Cache cache = mRequestQueue.getCache();
// 2.获取缓存中数据
if (cache != null) {
// 获取数据
Cache.Entry entry = cache.get(mUrl);
// 数据肯定在entry中
if (entry != null) {
byte[] data = entry.data;
if (data != null) {
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
mImageView.setImageBitmap(bitmap);
}
} else {
Toast.makeText(this, "缓存中没有该数据", Toast.LENGTH_LONG).show();
}
}