一,Volley所在地址
Volley
的Github
地址为https://github.com/mcxiaoke/android-volley
二,Volley的导入
compile 'com.mcxiaoke.volley:library:1.0.19'
三,Volley的基本使用
它的使用一般分为三步:
1,创建RequestQueue
对象,建立网络请求队列
2,生成XXXRequest
对象(XXX
代表String
,json
,image
等),定义网络请求的详细情况
3,将生成的XXXRequest
对象加入创建的RequestQueue
对象中,开始网络请求
下面来看看具体的使用
3.1,StringRequest
的使用
用于GET
请求时,代码为:
private String URL_GET = "https://api.thinkpage.cn/v3/weather/now.json?key=rot2enzrehaztkdk&location=guangzhou&language=zh-Hans&unit=c";
RequestQueue rq = Volley.newRequestQueue(this);//步骤一:建立请求队列
StringRequest sr = new StringRequest(URL_GET,//步骤二:生成StringRequest对象
new Response.Listener() {
@Override
public void onResponse(String response) {
Log.e("LHC", String.format("%s:%s", "volley_get_success:", response));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LHC", String.format("%s:%s", "volley_get_error:", error.getMessage()));
}
});
rq.add(sr);//步骤三:将生成的StringRequest对象加入请求队列中并执行网络请求
这样就完成了一次StringRequest
的GET
请求
用于POST
请求时,代码为:
private String URL_BASE = "http://api.k780.com:88/?app=phone.get";
RequestQueue rq = Volley.newRequestQueue(this);
StringRequest sr = new StringRequest(Request.Method.POST, URL_BASE, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.e("LHC", String.format("%s:%s", "volley_post_success:", response));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LHC", String.format("%s:%s", "volley_post_error:", error.getMessage()));
}
}) {
@Override
protected Map getParams() throws AuthFailureError {
Map params = new HashMap<>();
params.put("phone", "13800138000");
params.put("appkey", "10003");
params.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
params.put("format", "json");
params.put("idcard", "110101199001011114");
return params;
}
};
rq.add(sr);
}
需要注意的是,在进行POST
请求时,我们需要传入请求参数;这里我们就需要调用getParams()
来实现参数的传入了。这个方法是重写父类Request
的方法。
3.2,JsonObjectRequest
的使用
用于GET
请求,代码为:
private String URL_GET = "https://api.thinkpage.cn/v3/weather/now.json?key=rot2enzrehaztkdk&location=guangzhou&language=zh-Hans&unit=c";
RequestQueue rq = Volley.newRequestQueue(this);
JsonObjectRequest sr = new JsonObjectRequest(URL_GET,
new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
Log.e("LHC", String.format("%s:%s", "get_volley_json_success:", response.toString()));
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LHC", String.format("%s:%s", "get_volley_json_error:", error.getMessage()));
}
});
rq.add(sr);
用于POST
请求,代码为:
private String URL_BASE = "http://api.k780.com:88/?app=phone.get";
RequestQueue rq = Volley.newRequestQueue(this);
JsonObjectRequest sr = new JsonObjectRequest(Request.Method.POST, URL_BASE, new Response.Listener() {
@Override
public void onResponse(JSONObject response) {
Log.e("LHC", String.format("%s:%s", "volley_post_json_success:", response.toString()));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LHC", String.format("%s:%s", "volley_post_json_error:", error.getMessage()));
}
}) {
@Override
protected Map getParams() throws AuthFailureError {
Map params = new HashMap<>();
params.put("phone", "13800138000");
params.put("appkey", "10003");
params.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
params.put("format", "json");
params.put("idcard", "110101199001011114");
return params;
}
};
rq.add(sr);
这样就完成了JsonObjectRequest
的GET
和POST
的网络请求。
3.3,加载图片--ImageRequest
的使用
从名字就可以知道这个是用于图片请求的,具体看代码:
private String URL_IMAGE = "http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=5547913f8426cffc697fb7b68c3166a6/241f95cad1c8a7862b15ada86109c93d70cf505d.jpg";
RequestQueue rq = Volley.newRequestQueue(this);
ImageRequest ir = new ImageRequest(URL_IMAGE, new Response.Listener() {
@Override
public void onResponse(Bitmap response) {
if (response != null) {
ivShow.setImageBitmap(response);
}
}
}, 0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("LHC", "post_volley_image->error:" + error.toString());
}
});
rq.add(ir);
通过上面的代码,就可以将网络图片获取并加载出来;来具体看看这个请求中的参数:
public ImageRequest(String url,//网络图片的网址
Response.Listener listener, //图片获取成功回调
int maxWidth, //自定义图片宽
int maxHeight, //自定义图片高
ScaleType scaleType, //图片变换类型
Config decodeConfig, //图片解析配置
Response.ErrorListener errorListener) //图片获取失败回调
scaleType
的值,系统提供的有这么几种:CENTER_CROP
,MATRIX
,FIT_XY
,FIT_START
,FIT_CENTER
,FIT_END
,CENTER
,CENTER_INSIDE
decodeConfig
的值,系统提供的有这么几种:
ALPHA_8
, RGB_565
, ARGB_4444
, ARGB_8888
, RGBA_F16
, HARDWARE
注意:如果加载的图片过大,容易造成OOM
3.4,加载图片--ImageLoader
的使用
ImageLoader
加载图片的步骤和ImageRequest
的不同,大致分为四步:
1,创建RequestQueue
对象
2,创建ImageLoader
对象
3,创建ImageLoader.ImageListener
对象
4,使用ImageLoader
对象调用get(String requestUrl, final ImageListener listener)
方法来加载网络图片
下面我们来看具体代码:
private String URL_IMAGE = "http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=5547913f8426cffc697fb7b68c3166a6/241f95cad1c8a7862b15ada86109c93d70cf505d.jpg";
RequestQueue rq = Volley.newRequestQueue(this);
ImageLoader il = new ImageLoader(rq, new ImageLoader.ImageCache() {//这里直接使用系统提供的ImageCache来实现,也可以自定义一个图片缓存
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
ImageLoader.ImageListener listener = ImageLoader.getImageListener(
ivShow, //显示图片的控件
R.mipmap.ic_launcher, //默认加载中的图片
R.mipmap.ic_launcher);//加载失败时的图片
il.get(URL_IMAGE, listener);
这样就完成了图片的加载。但是我们来看看这行代码:
ImageLoader il = new ImageLoader(rq, new ImageLoader.ImageCache() {//这里直接使用系统提供的ImageCache来实现,也可以自定义一个图片缓存
@Override
public Bitmap getBitmap(String url) {
return null;
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
});
在生成ImageLoader
对象时,传入了两个参数,一个是RequestQueue
对象,另一个是ImageCache
对象,这个是用来设置图片缓存的,但是系统提供的ImageLoader.ImageCache
中并没有进行缓存的处理,是一个空实现。所以我们如果需要实现图片缓存的话,我们可以定义一个。看下面代码:
class BitmapCache implements ImageLoader.ImageCache {
private LruCache mCache;
BitmapCache() {
int maxCacheSize = 10 * 1024 * 1024;
mCache = new LruCache(maxCacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
Log.e("LHC", "SIZE:"+value.getRowBytes()*value.getHeight());
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}
这样我们就建立好了自己的图片缓存了,那么生成ImageLoader
对象的代码就变成了:
ImageLoader il = new ImageLoader(rq, new BitmapCache());
这样我们就实现了ImageLoader
图片缓存的功能了。ImageLoader
的内部也是使用ImageRequest
来实现的,不过ImageLoader
明显要比ImageRequest
更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
3.5,加载图片--NetworkImageView
NetworkImageView
和上面的加载图片的方式都不同,它是一种自定义控件,继承自ImageView
,具有ImageView
的所有功能,还添加了能够加载网络图片的功能。我们来看它的使用:
在XML
中加入:
在代码中使用:
RequestQueue rq = Volley.newRequestQueue(this);
ImageLoader il = new ImageLoader(rq, new BitmapCache());
nivShow.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载中显示的图片
nivShow.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败显示的图片
nivShow.setImageUrl(URL_IMAGE_01, il);//加载图片并显示
这样我们也就完成了网络图片的加载。到此volley
的基本用法就讲完了。