上一篇给大家讲解了Volley的使用,因为重复代码比较多,这篇给大家简单的吧Volley封装一下.方便以后使用
创建VolleyRequestUtil工具类
实现单利模式,保证实例唯一化:
public class VolleyRequestUtil {
private VolleyRequestUtil(){}
private static volatile VolleyRequestUtil mVolleyRequestUtil;
private static Context mContext;
private RequestQueue requestQueue;
public static VolleyRequestUtil getInstance(Context context){
if (mVolleyRequestUtil == null) {
synchronized (VolleyRequestUtil.class){
if (mVolleyRequestUtil == null) {
mContext = context;
mVolleyRequestUtil = new VolleyRequestUtil();
}
}
}
return mVolleyRequestUtil;
}
........
}
StringRequest封装
/**
*
* @param url 用于请求文本接口
* @param volleyStringInterface 用于实现请求接口
*/
public void StringRequest(String url, VolleyStringInterface volleyStringInterface){
getVolley();
StringRequest stringRequest = new StringRequest(url, volleyStringInterface.onStringResponse(), volleyStringInterface.onErr());
requestQueue.add(stringRequest);
}
VolleyStringInterface接口
/**
* 文本实现接口
*/
public interface VolleyStringInterface{
public Response.Listener<String> onStringResponse();
public Response.ErrorListener onErr();
}
getVolley()方法
//获取RequestQueue对象
private void getVolley(){
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(mContext);
}
}
使用:
//参数一:文本接口
//参数二:VolleyStringInterface接口实例
VolleyRequestUtil.getInstance(this).StringRequest(STRINGREQUEST_URL, new VolleyRequestUtil.VolleyStringInterface() {
@Override
public Response.Listener<String> onStringResponse() {
//这里返回值是什么就new什么
return new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("VolleyStringRequest",response);
}
};
}
@Override
public Response.ErrorListener onErr() {
// //这里返回值是什么就new什么
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("VolleyStringRequest",error.getMessage());
}
};
}
});
注释都有所讲解,请详细阅读注释:
来看看Log吧:
JsonObjectRequest GET封装
/**
*
* @param url 请求GET接口
* @param volleyListenerInterface
*/
public void GETJsonObjectRequest(String url, VolleyListenerInterface volleyListenerInterface){
getVolley();
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url,
null,volleyListenerInterface.onResponse(),volleyListenerInterface.onErr());
requestQueue.add(jsonObjectRequest);
}
VolleyListenerInterface接口:
/**
* JsonObject实现接口
*/
public interface VolleyListenerInterface {
/**
*
* @return 返回JSONObject接口对象
*/
public abstract Response.Listener<JSONObject> onResponse();
/**
*
* @return 报错提示
*/
public abstract Response.ErrorListener onErr();
}
使用:
VolleyRequestUtil.getInstance(this).GETJsonObjectRequest("http://www.weather.com.cn/data/city3jdata/china.html", new VolleyRequestUtil.VolleyListenerInterface() {
@Override
public Response.Listener<JSONObject> onResponse() {
//这里需要什么就new什么
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("onResponse", response.toString());
}
};
}
@Override
public Response.ErrorListener onErr() {
//这里需要什么就new什么
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("onErrorResponse", error.getMessage());
}
};
}
});
来康康效果吧:
JsonObjectRequest POST封装
/**
*
* @param url 请求POST接口
* @param hashMap 请求POST参数
* @param volleyListenerInterface
*/
public void POSTJsonObjectRequest(String url, final HashMap hashMap, VolleyListenerInterface volleyListenerInterface){
getVolley();
JSONObject jsonObject = new JSONObject(hashMap);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,
jsonObject,volleyListenerInterface.onResponse(),volleyListenerInterface.onErr()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
hashMap.put("Accept", "application/json");
hashMap.put("Content-Type", "application/json; charset=UTF-8");
return hashMap;
}
};
requestQueue.add(jsonObjectRequest);
}
VolleyListenerInterface接口:
/**
* JsonObject实现接口
*/
public interface VolleyListenerInterface {
/**
*
* @return 返回JSONObject接口对象
*/
public abstract Response.Listener<JSONObject> onResponse();
/**
*
* @return 报错提示
*/
public abstract Response.ErrorListener onErr();
}
使用:
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("app_key","74D2E724FE2B69EF7EA3F38E9400CF71");
VolleyRequestUtil.getInstance(this).POSTJsonObjectRequest("POST接口", hashMap, new VolleyRequestUtil.VolleyListenerInterface() {
@Override
public Response.Listener<JSONObject> onResponse() {
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
}
};
}
@Override
public Response.ErrorListener onErr() {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
};
}
});
ImageRequest封装
/**
*
* @param url 请求图片接口
* @param maxWidth 解码此位图的最大宽度,或0表示无 参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,
* 则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩
* @param maxHeigth 解码此位图的最大高度,或为零表示无
* @param rgb 设置颜色属性 Bitmap.Config.ARGB_8888 属性最好
* @param volleyImageInterface 图片正确错误接口
*/
public void ImageRequest(String url, int maxWidth, int maxHeigth, Bitmap.Config rgb, VolleyImageInterface volleyImageInterface){
getVolley();
ImageRequest imageRequest = new ImageRequest(
url,
volleyImageInterface.onBitmap(),
maxWidth,
maxHeigth,
rgb,
volleyImageInterface.onErr()
);
requestQueue.add(imageRequest);
}
VolleyImageInterface 实现接口:
/**
* Bitmap实现接口
*/
public interface VolleyImageInterface {
/**
*
* @return 返回Bitmap图片
*/
public abstract Response.Listener<Bitmap> onBitmap();
/**
*
* @return 报错
*/
public abstract Response.ErrorListener onErr();
}
使用:
VolleyRequestUtil.getInstance(this).ImageRequest("http://api.map.baidu.com/images/weather/day/zhenyu.png", 0, 0, Bitmap.Config.ARGB_8888, new VolleyRequestUtil.VolleyImageInterface() {
@Override
public Response.Listener<Bitmap> onBitmap() {
return new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
mImage.setImageBitmap(response);
}
};
}
@Override
public Response.ErrorListener onErr() {
return new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.i("onErrorResponse", error.getMessage());
}
};
}
});
ImageLoader封装
/**
*
* @param view 设置的ImageView
* @param uri 加载图片的路径
* @param defaultImageResId 未加载出图片时的图片
* @param errorImageResId 加载报错时的图片
* @param maxWidth 图像的最大宽度
* @param maxHeight 图像的最大高度
* @param volleyImageLoaderLolderInterface 缓存接口
*/
public void ImageLoader(ImageView view ,String uri, int defaultImageResId, final int errorImageResId ,int maxWidth, int maxHeight, VolleyImageLoaderLolderInterface volleyImageLoaderLolderInterface){
getVolley();
ImageLoader imageLoader = new ImageLoader(requestQueue, volleyImageLoaderLolderInterface.onCache());
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(view, defaultImageResId, errorImageResId);
imageLoader.get(uri, imageListener,maxWidth,maxHeight);
}
/**
*
* @param view 设置的ImageView
* @param uri 加载图片的路径
* @param defaultImageResId 未加载出图片时的图片
* @param errorImageResId 加载报错时的图片
* @param volleyImageLoaderLolderInterface 缓存接口
*/
public void ImageLoader(ImageView view ,String uri, int defaultImageResId, final int errorImageResId ,VolleyImageLoaderLolderInterface volleyImageLoaderLolderInterface){
getVolley();
ImageLoader imageLoader = new ImageLoader(requestQueue, volleyImageLoaderLolderInterface.onCache());
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(view, defaultImageResId, errorImageResId);
imageLoader.get(uri, imageListener);
}
VolleyImageLoaderLolderInterface接口:
/**
* ImageLolder实现可缓存图片接口
*/
public interface VolleyImageLoaderLolderInterface {
/**
*
* @return 缓存
* ImageLoader.ImageCache 返回2个参数 getBitmap(String url) 参数一:返回当前请求的接口
* putBitmap(String url, Bitmap bitmap) 参数一:返回当前请求的接口,参数二:返回当前Bitmap对象
* 主要用来进行缓存
*/
public abstract ImageLoader.ImageCache onCache();
}
使用:
VolleyRequestUtil.getInstance(this).ImageLoader(image2,
"http://api.map.baidu.com/images/weather/night/duoyun.png",
R.drawable.ic_launcher_foreground,
R.drawable.ic_launcher_background,
new VolleyRequestUtil.VolleyImageLoaderLolderInterface() {
@Override
public ImageLoader.ImageCache onCache() {
return new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
};
}
}
);
完整代码:
package demo.ht.com.volley.http;
import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;
import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
/**
* Created by szj 20200714
* implementation 'com.android.volley:volley:1.1.1'
*/
public class VolleyRequestUtil {
private VolleyRequestUtil(){}
private static volatile VolleyRequestUtil mVolleyRequestUtil;
private static Context mContext;
private RequestQueue requestQueue;
public static VolleyRequestUtil getInstance(Context context){
if (mVolleyRequestUtil == null) {
synchronized (VolleyRequestUtil.class){
if (mVolleyRequestUtil == null) {
mContext = context;
mVolleyRequestUtil = new VolleyRequestUtil();
}
}
}
return mVolleyRequestUtil;
}
/**
*
* @param url 请求GET接口
* @param volleyListenerInterface
*/
public void GETJsonObjectRequest(String url, VolleyListenerInterface volleyListenerInterface){
getVolley();
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url,
null,volleyListenerInterface.onResponse(),volleyListenerInterface.onErr());
requestQueue.add(jsonObjectRequest);
}
/**
*
* @param url 用于请求文本接口
* @param volleyStringInterface 用于实现请求接口
*/
public void StringRequest(String url, VolleyStringInterface volleyStringInterface){
getVolley();
StringRequest stringRequest = new StringRequest(url, volleyStringInterface.onStringResponse(), volleyStringInterface.onErr());
requestQueue.add(stringRequest);
}
/**
* 获取RequestQueue对象
*/
private void getVolley(){
if (requestQueue == null) {
requestQueue = Volley.newRequestQueue(mContext);
}
}
/**
*
* @param url 请求POST接口
* @param hashMap 请求POST参数
* @param volleyListenerInterface
*/
public void POSTJsonObjectRequest(String url, final HashMap hashMap, VolleyListenerInterface volleyListenerInterface){
getVolley();
JSONObject jsonObject = new JSONObject(hashMap);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST,url,
jsonObject,volleyListenerInterface.onResponse(),volleyListenerInterface.onErr()){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
hashMap.put("Accept", "application/json");
hashMap.put("Content-Type", "application/json; charset=UTF-8");
return hashMap;
}
};
requestQueue.add(jsonObjectRequest);
}
/**
*
* @param url 请求图片接口
* @param maxWidth 解码此位图的最大宽度,或0表示无 参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,
* 则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩
* @param maxHeigth 解码此位图的最大高度,或为零表示无
* @param rgb 设置颜色属性 Bitmap.Config.ARGB_8888 属性最好
* @param volleyImageInterface 图片正确错误接口
*/
public void ImageRequest(String url, int maxWidth, int maxHeigth, Bitmap.Config rgb, VolleyImageInterface volleyImageInterface){
getVolley();
ImageRequest imageRequest = new ImageRequest(
url,
volleyImageInterface.onBitmap(),
maxWidth,
maxHeigth,
rgb,
volleyImageInterface.onErr()
);
requestQueue.add(imageRequest);
}
/**
*
* @param view 设置的ImageView
* @param uri 加载图片的路径
* @param defaultImageResId 未加载出图片时的图片
* @param errorImageResId 加载报错时的图片
* @param maxWidth 图像的最大宽度
* @param maxHeight 图像的最大高度
* @param volleyImageLoaderLolderInterface 缓存接口
*/
public void ImageLoader(ImageView view ,String uri, int defaultImageResId, final int errorImageResId ,int maxWidth, int maxHeight, VolleyImageLoaderLolderInterface volleyImageLoaderLolderInterface){
getVolley();
ImageLoader imageLoader = new ImageLoader(requestQueue, volleyImageLoaderLolderInterface.onCache());
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(view, defaultImageResId, errorImageResId);
imageLoader.get(uri, imageListener,maxWidth,maxHeight);
}
/**
*
* @param view 设置的ImageView
* @param uri 加载图片的路径
* @param defaultImageResId 未加载出图片时的图片
* @param errorImageResId 加载报错时的图片
* @param volleyImageLoaderLolderInterface 缓存接口
*/
public void ImageLoader(ImageView view ,String uri, int defaultImageResId, final int errorImageResId ,VolleyImageLoaderLolderInterface volleyImageLoaderLolderInterface){
getVolley();
ImageLoader imageLoader = new ImageLoader(requestQueue, volleyImageLoaderLolderInterface.onCache());
ImageLoader.ImageListener imageListener = ImageLoader.getImageListener(view, defaultImageResId, errorImageResId);
imageLoader.get(uri, imageListener);
}
/**
* Bitmap实现接口
*/
public interface VolleyImageInterface {
/**
*
* @return 返回Bitmap图片
*/
public abstract Response.Listener<Bitmap> onBitmap();
/**
*
* @return 报错
*/
public abstract Response.ErrorListener onErr();
}
/**
* ImageLolder实现可缓存图片接口
*/
public interface VolleyImageLoaderLolderInterface {
/**
*
* @return 缓存
* ImageLoader.ImageCache 返回2个参数 getBitmap(String url) 参数一:返回当前请求的接口
* putBitmap(String url, Bitmap bitmap) 参数一:返回当前请求的接口,参数二:返回当前Bitmap对象
* 主要用来进行缓存
*/
public abstract ImageLoader.ImageCache onCache();
}
/**
* JsonObject实现接口
*/
public interface VolleyListenerInterface {
/**
*
* @return 返回JSONObject接口对象
*/
public abstract Response.Listener<JSONObject> onResponse();
/**
*
* @return 报错提示
*/
public abstract Response.ErrorListener onErr();
}
/**
* 文本实现接口
*/
public interface VolleyStringInterface{
public Response.Listener<String> onStringResponse();
public Response.ErrorListener onErr();
}
}
封装的可能没有个别大佬完善,但我已经尽力了,要有更高见解,请在评论区留言哦~~
如果还有感兴趣的小伙伴,可以查看我的下一篇Android 网络请求框架(三)Retrofit+RxJava配合使用.
Git链接: langyangyang.