目 录(本篇字数:1622)
-
介绍
Volley,它是android的一项热门的开源网络框架,是Gooogle I/O 2013发布的一个处理和缓存网络请求的库。既然我们知道它是用于网络请求的,那总是有它独到的优点。
-
Volley特点
1、可以对网络请求进行排序
2、网络请求优先级处理
3、缓存
4、多级别取消请求
5、和Activity生命周期联动
6、可以自定义拓展
7、非常适合数据量不大,但是通信频繁的请求
但是它的一个致命缺点:在数据量盘大的请求状态(例如:文件下载),volley表现很糟糕。
-
使用步骤
当然,我们重点是会如何去使用它,下面我们通过一些简单的代码,来学习volley的基本用法。
Volley基本使用步骤(掌握这个套路即可)
一、创建一个请求队列
二、创建一个请求方式
三、往队列里添加请求
-
请求方式
Volley的使用,通常是以上的三个步骤就可以完成一个网络请求操作。例如,发送一个get请求,我们看下代码的实现。(url即是百度首页地址,当然你也可以随意选一个)
-
StringRequest方式的GET请求
StringRequest(请求返回的是string类型)
/**
* 不带参数的 GET 请求方式
*/
private void volleyGetRequest() {
RequestQueue requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.i("--get请求--", "onResponse: " + s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) {
Log.i("--get请求--", "onResponse: " + e);
}
});
requestQueue.add(stringRequest);
}
StringRequest方式的POST请求(携带参数)
/**
* 携带参数的POST请求,StringRequest请求方式
*/
private void volleyPostRequestWithParams() {
RequestQueue requestQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.i("--post请求--", "onResponse: " + s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) {
Log.i("--post请求--", "onResponse: " + e);
}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<>();
params.put("param1", "test1");
params.put("param2", "test2");
return params;
}
};
requestQueue.add(stringRequest);
}
-
JsonObjectRequest方式的POST请求
JsonObjectRequest(请求返回的是JSONObject类型)
/**
* 发送 POST 请求
* JsonObjectRequest 请求方式,返回的是 JSONObject 类型的数据
*/
private void volleyPostRequest() throws JSONException {
RequestQueue requestQueue = Volley.newRequestQueue(this);
JSONObject json = new JSONObject();
json.put("param1", "test1");
json.put("param2", "test2");
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, json,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject obj) {
Log.i("--post请求--", "onResponse: " + obj);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError e) {
Log.i("--post请求--", "onResponse: " + e);
}
});
requestQueue.add(jsonObjectRequest);
}
-
ImageRequest方式请求图片
ImageRequest(请求返回的是Bitmap类型)
String URL = "http://thyrsi.com/t6/364/1535451629x1822611251.jpg";
/**
* ImageRequest 请求方式,用于请求图片链接,返回的是 Bitmap 类型的数据
*/
private void volleyImageRequest() {
RequestQueue requestQueue = Volley.newRequestQueue(this);
ImageRequest imageRequest = new ImageRequest(URL,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
iv_show_image.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.RGB_565,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
requestQueue.add(imageRequest);
}
注意:Bitmap.Config里面的参数设置。
-
ImageLoader方式请求图片
注意也是volley包下的ImageLoader类
String URL = "http://thyrsi.com/t6/364/1535451629x1822611251.jpg";
private LruCache<String, Bitmap> mCache = null;
/**
* 注意ImageLoader也是volley包下的
* ImageLoader实现加载图片,添加图片缓存,避免oom
*/
private void volleyImageRequest() {
RequestQueue requestQueue = Volley.newRequestQueue(this);
ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String s) {
final int maxSize = 10 * 1024 * 1024;//10M大小的缓存
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
return mCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
mCache.put(s, bitmap);
}
});
/**
* params 1 : 目标imageview控件
* params 2 : 默认显示的image
* params 3 : 加载失败时显示的image
*/
ImageLoader.ImageListener imageListener = ImageLoader.
getImageListener(iv_show_image, R.mipmap.ic_launcher, R.mipmap.ic_launcher_round);
imageLoader.get(URL, imageListener);
}
-
最后一种以控件的使用方式
(与系统控件使用一致,这里就不做太多说明)
<com.android.volley.toolbox.NetworkImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
-
Volley请求封装
以单例模式创建网络请求操作,以同一个消息队列管理请求消息。
/**
* volley 请求方式封装类
*
* @Created by xww.
* @Creation time 2018/8/28.
*/
public final class SimpleRequest {
private static final RequestQueue mRequestQueue = Volley.newRequestQueue(App.getContext());
private LruCache<String, Bitmap> mCache = null;
private static final class Holder {
private static final SimpleRequest INSTANCE = new SimpleRequest();
}
static SimpleRequest getInstance() {
return Holder.INSTANCE;
}
public final void sendStringRequest(String url, Response.Listener<String> success, Response.ErrorListener error) {
StringRequest stringRequest = new StringRequest(url, success, error);
mRequestQueue.add(stringRequest);
}
public final void sendStringRequest(int method, String url, Response.Listener<String> success,
Response.ErrorListener error, final Map<String, String> params) {
StringRequest stringRequest = new StringRequest(method, url, success, error) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
mRequestQueue.add(stringRequest);
}
public final void sendJSONRequest(int method, String url, JSONObject jsonObject,
Response.Listener<JSONObject> success, Response.ErrorListener error) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(method, url, jsonObject, success, error);
mRequestQueue.add(jsonObjectRequest);
}
/**
* @param decodeConfig 位图的属性配置
*/
public final void sendImageRequest(String url, int maxWidth, int maxHeight, Bitmap.Config decodeConfig,
Response.Listener<Bitmap> success, Response.ErrorListener error) {
ImageRequest imageRequest = new ImageRequest(url, success, maxWidth, maxHeight, decodeConfig, error);
mRequestQueue.add(imageRequest);
}
/**
* 默认的ImageRequest,最大宽、高不进行设定
* Bitmap默认为占用最小配置
*/
public final void sendImageRequest(String url, Response.Listener<Bitmap> success, Response.ErrorListener error) {
ImageRequest imageRequest = new ImageRequest(url, success, 0, 0, Bitmap.Config.RGB_565, error);
mRequestQueue.add(imageRequest);
}
/**
* 拥有缓存机制的加载Image方式
*
* @param target 目标ImageView
* @param defalutRes 默认显示图片
* @param errorRes 失败时显示图片
*/
public final void sendImageLoader(String url, ImageView target, int defalutRes, int errorRes) {
ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String s) {
final int maxSize = 10 * 1024 * 1024;//10M大小的缓存
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
return mCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
mCache.put(s, bitmap);
}
});
ImageLoader.ImageListener imageListener = ImageLoader.
getImageListener(target, defalutRes, errorRes);
imageLoader.get(url, imageListener);
}
}
封装类的使用方式:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_request_get:
SimpleRequest
.getInstance()
.sendStringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Log.i("--get请求--", "onResponse: " + s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
break;
case R.id.btn_request_post:
JSONObject jsonObject = new JSONObject();
SimpleRequest.getInstance()
.sendJSONRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
break;
case R.id.btn_image_request:
SimpleRequest.getInstance()
.sendImageLoader(URL, iv_show_image, R.mipmap.ic_launcher, R.mipmap.ic_launcher_round);
break;
}
}
Volley的基本使用就简单的介绍完了,因为Volley本身已经很简洁、易用了,所以我们继续的封装几种通用和常用的请求方式,让网络请求框架使用起来更加的方便。
©原文链接:https://blog.csdn.net/smile_Running/article/details/82150014
@作者博客:_Xu2WeI
@更多博文:查看作者的更多博文