一、简介
1)所谓Volley,它是2013年Google I/O上发布的一款网络框架,基于Android平台,能使网络通信更快,更简单,更健全。
2)优点
(1) 网络请求的排序(scheduling)
(2) 网络请求的优先级处理
(3) 缓存
(4) 多级别取消请求
(5) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)
(6) 非常适合去进行数据量不大,但通信频繁的网络操作
(7) 可以自定义拓展
3)缺点
对于大数据量的网络操作,比如说下载文件等,Volley的表现不好
二、下载地址
1)官网地址:https://android.googlesource.com/platform/frameworks/volley
2)jar包下载地址:链接:https://pan.baidu.com/s/1yzEfMNn7g8tQOCnu8jN74A 提取码:gbs6
三、API
1)请求String类型数据:StringRequest
2)请求JSON数据:JsonRequest(JsonObjectRequest (对象)、JsonArrayRequest(数组))
3)请求图片数据:ImageRequest
四、使用步骤
1)导入jar包
2)添加联网权限
<uses-permission android:name="android.permission.INTERNET" />
五、例子
1)网络请求
(1)get请求
//1.创建一个请求队列
RequestQueue requestQueue = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个请求
String uri = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
StringRequest stringRequest = new StringRequest(uri, new Response.Listener<String>() {
//正确接收数据的回调
@Override
public void onResponse(String response) {
tvVolleyResult.setText(response);
}
}, new Response.ErrorListener() {
//发生异常后的监听回调
@Override
public void onErrorResponse(VolleyError error) {
tvVolleyResult.setText("加载失败"+error);
}
});
//3.将创建的请求添加到请求队列中
requestQueue.add(stringRequest);
(2)post请求
//1.创建一个请求队列
RequestQueue requestQueue1 = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个post请求
String uri1 = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
StringRequest stringRequest1 = new StringRequest(Request.Method.POST, uri1, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
tvVolleyResult.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
tvVolleyResult.setText("请求失败"+error);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map = new HashMap<>();
// map.put("value","param");//带参数post
return map;
}
};
//3.将创建的请求添加到请求队列中
requestQueue1.add(stringRequest1);
(3)请求json数据
//1.创建一个请求队列
RequestQueue requestQueue2 = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个请求
String uri2 = "http://api.m.mtime.cn/PageSubArea/TrailerList.api";
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(uri2, new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
tvVolleyResult.setText(response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
tvVolleyResult.setText("请求失败"+error);
}
});
//3.将创建的请求添加到请求队列中
requestQueue2.add(jsonArrayRequest);
2)图片加载
(1)ImageRequest加载图片
//1.创建一个请求队列
RequestQueue requestQueue3 = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个图片的请求
String uri3 = "http://img.wxcha.com/file/201603/07/7ec4c7c1f7.jpg";
ImageRequest imageRequest = new ImageRequest(uri3, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
ivVolleyResult.setVisibility(View.VISIBLE);
ivVolleyResult.setImageBitmap(response);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
ivVolleyResult.setImageResource(R.mipmap.ic_launcher);
}
});
//3.将创建的请求添加到请求队列中
requestQueue3.add(imageRequest);
(2)ImageLoader加载图片
//1.创建一个请求队列
RequestQueue requestQueue4 = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个imageloader
ImageLoader imageLoader = new ImageLoader(requestQueue4, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
//3.加载图片
String uri5 = "http://www.shuoshuokong.com/uploads/allimg/150929/1-15092Z11017.jpg";
ivVolleyResult.setVisibility(View.VISIBLE);
ImageLoader.ImageListener imageListener = imageLoader.getImageListener(ivVolleyResult,R.mipmap.ic_launcher,R.drawable.atguigu_logo);
imageLoader.get(uri5,imageListener);
带缓存的加载图片:
缓存工具类:
package com.atguigu.android.atguigu.volley;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
/**
* Created by Administrator on 2016/10/13.
*/
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
修改代码:
//1.创建一个请求队列
RequestQueue requestQueue4 = Volley.newRequestQueue(VolleyActivity.this);
//2.创建一个imageloader
// ImageLoader imageLoader = new ImageLoader(requestQueue4, new ImageLoader.ImageCache() {
// @Override
// public Bitmap getBitmap(String url) {
// return null;
// }
//
// @Override
// public void putBitmap(String url, Bitmap bitmap) {
//
// }
// });
ImageLoader imageLoader = new ImageLoader(requestQueue4, new BitmapCache());
//3.加载图片
String uri5 = "http://www.shuoshuokong.com/uploads/allimg/150929/1-15092Z11017.jpg";
ivVolleyResult.setVisibility(View.VISIBLE);
ImageLoader.ImageListener imageListener = imageLoader.getImageListener(ivVolleyResult,R.mipmap.ic_launcher,R.drawable.atguigu_logo);
imageLoader.get(uri5,imageListener);
(3)NetworkImageView加载图片
布局:com.android.volley.toolbox.NetworkImageView
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/iv_volley_networkimagview"
android:layout_width="200dp"
android:layout_height="200dp"
android:visibility="gone">
</com.android.volley.toolbox.NetworkImageView>
//1.让控件显示
ivVolleyNetworkimagview.setVisibility(View.VISIBLE);
//2.创建一个请求队列
RequestQueue requestQueue5 = Volley.newRequestQueue(VolleyActivity.this);
//3.创建一个imageloader
ImageLoader imageLoader1 = new ImageLoader(requestQueue5,new BitmapCache());
//4.设置默认图片和异常图片
ivVolleyNetworkimagview.setDefaultImageResId(R.mipmap.ic_launcher);
ivVolleyNetworkimagview.setErrorImageResId(R.drawable.atguigu_logo);
//5.加载图片
String uri6 = "http://126306.sgss8.com/upload/2016042922/224504_267.jpg";
ivVolleyNetworkimagview.setImageUrl(uri6,imageLoader1);