一、Volley简介
- 直接用HttpURLConnection和HttpClient进行网络请求比较复杂,不进行封装的话,会有很多重复代码
- 2013年Google I/O大会上推出了一个新的网络通信框架——Volley,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕
二、Volley的使用场景(简单信息的数据加载,图片等)
三、导入Volley(可以直接将volley的源码拷贝到工程的相应的目录下)
- 从中心库加载---只能选择镜像(mcxiaoke等)
- github下载library源码—也是只有镜像的源码(比如:https://github.com/mcxiaoke/android-volley)
- google官方下载library源码:https://android.googlesource.com/platform/frameworks/volley
- 导入jar包
四、 使用Volley
- 三种基本网络请求的实现
第一步:
新建请求队列:
RequestQueue mQueue = Volley.newRequestQueue(context); //一个工程用一个请求队列即可,可以建一个自定义的application,并在清单文件中注册
第二步:新建request
第三步:把request加入请求队列
- StringRequest
Get请求:
2.JsonRequest
JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它
的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和 JsonArrayRequest
相比ImageRequest,可以设置内存缓存,可以设置加载和失败时默认显示的图片
//应该保证一个运用一个对象,通常我们会将这种需要统一的对象放在自定义的application里面(需要在清单文件中注册,在application标签下的name
//属性,将我们自定义的application导入),
//这样就保证了整个项目中的这个对象就是同一个了
mRequestQueue = Volley.newRequestQueue(this);
public void stringGetRequest() {
//新建一个字符串网络请求
//第一个参数:url--请求的网址
//第二个参数:响应监听
//第三个参数:错误监听
StringRequest request = new StringRequest(
"https://www.baidu.com/",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("qfstringRequest",response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
//把请求加入队列
requestQueue.add(request);
}
post请求:
StringRequest postStringRequest = new StringRequest(
Request.Method.POST,//请求方式
"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",//请求地址
new Response.Listener<String>() {//请求成功后返回的结果
@Override
public void onResponse(String response) {
Log.d("VolleyLesson",response);
}
},
new Response.ErrorListener() {//请求失败后返回的错误信息
@Override
public void onErrorResponse(VolleyError error) {
Log.d("VolleyLesson",error.getMessage());
}
}
){
/**
*封装请求参数,post请求需要把请求参数另外存储,而get请求只需要拼接到请求地址后面就可以,当然也可以使用封装参数的方法
*
*/
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> mapParam = new HashMap<String,String>();
// 设置参数
// pagesize 每页多少行
mapParam.put("pagesize", "20");
// pageindex 页码
mapParam.put("pageindex", "2");
return mapParam;
}
};
mRequestQueue.add(postStringRequest);
取消重复的请求,这样能够防止用户连续点击的时候,只发送一次请求,这样即减轻网络加载的负担,也减少流量的使用
mRequestQueue.cancelAll("test");
postStringRequest.setTag("test");
2.JsonRequest
JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它
的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和 JsonArrayRequest
JsonRequest jsonRequest = new JsonObjectRequest (Request.Method.POST,//请求方式
"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",//请求的地址
new Response.Listener<JSONObject>() {//请求成功的监听
@Override
public void onResponse(JSONObject response) {//response就是返回的json数据
Log.d("volleylesson",response.toString());
}
},
new Response.ErrorListener() {//请求失败的监听
@Override
public void onErrorResponse(VolleyError error) {//返回请求失败的错误信息
}
}
){
//封装请求参数
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> mapParam = new HashMap<String,String>();
// 设置参数
// pagesize 每页多少行
mapParam.put("pagesize", "20");
// pageindex 页码
mapParam.put("pageindex", "2");
return mapParam;
}
};
mRequestQueue.add(jsonRequest);//加入请求队列
3.ImageRequest(图片请求)
public void showImgByImageReq(){
/**
* Creates a new image request, decoding to a maximum specified width and
* height. If both width and height are zero, the image will be decoded to
* its natural size. If one of the two is nonzero, that dimension will be
* clamped and the other one will be set to preserve the image's aspect
* ratio. If both width and height are nonzero, the image will be decoded to
* be fit in the rectangle of dimensions width x height while keeping its
* aspect ratio.
*
* @param url URL of the image
* @param listener Listener to receive the decoded bitmap
* @param maxWidth Maximum width to decode this bitmap to, or zero for none
* @param maxHeight Maximum height to decode this bitmap to, or zero for
* none
* @param scaleType The ImageViews ScaleType used to calculate the needed image size.
* @param decodeConfig Format to decode the bitmap to
* @param errorListener Error listener, or null to ignore errors
*/
ImageRequest imageRequest = new ImageRequest(
"https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",//图片请求地址
new Response.Listener<Bitmap>() {//请求成功后的监听
@Override
public void onResponse(Bitmap response) {//返回Bitmap类型的图片资源
ivImageReq.setImageBitmap(response);
}
},
500, //设置图片最大的宽度
500, //设置图片的最大的高度
ImageView.ScaleType.CENTER,//设置图片的存放的类型,是居中,拉伸,等比例缩放...
Bitmap.Config.ARGB_8888,//设置一个像素点占多少个字节,当且8888代表每个像素点有4个字节
new Response.ErrorListener() {//请求失败的监听
@Override
public void onErrorResponse(VolleyError error) {
Log.i("rag"," 错误信息"+error.getMessage());
}
});
mRequestQueue.add(imageRequest);//加入请求队列
}
4.ImageLoad
相比ImageRequest,可以设置内存缓存,可以设置加载和失败时默认显示的图片
/**
* 查找顺序:先查找内存,再查找本地文件,最后从网络下载
* 存储顺序:从网络下载->存在内存,同时存放到本地文件
* 如果没有写到缓存,只存在本地文件
*/
private void showImgByImageLoad() {
//获取APP能使用的最大内存
//last recently use:最近最少使用的算法
int iMaxMem = (int) Runtime.getRuntime().maxMemory();
final LruCache<String,Bitmap> lruCache = new LruCache<String,Bitmap>(iMaxMem/8){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();//返回图片的大小 默认返回1
}
};
ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {//从内存中获取照片
return lruCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url,bitmap);//将图片写入内存
}
});
/**@param view The imageView that the listener is associated with.
* @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
* @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
*/
ImageLoader.ImageListener listener = ImageLoader.getImageListener(ivImageReq,
R.mipmap.ic_launcher,//设置默认图片
R.mipmap.ic_launcher);
//自己给imageview控件设置值
/*ImageLoader.ImageListener listener = new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
iv.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) {
iv.setImageResource(R.mipmap.ic_launcher);
}
};*/
imageLoader.get("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
listener
);
}
5.NetworkImage解决了图片错位的问题,
private void showNetImg() {
ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;//获取内存的资源
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
//将加载的图片存储在内存中
}
});
mNetworkImageView.setDefaultImageResId(R.mipmap.ic_launcher);//设置默认图片
mNetworkImageView.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败后显示的照片
mNetworkImageView.setImageUrl("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
imageLoader);
}