Volley是Google官方的网络异步请求库,最大的特点是简单高效,多并发。但Volley不适合数据的上传和下载。
一、Get请求的使用
1、根据请求数据返回的形式选择合适的对象
Volley提供了StringRequest、JsonObjectRequest、JsonArrayRequest三种对象供我们选择。
(a)StringRequest ——- 主要用于我们不确定数据返回类型的情况。
(b)JsonObjectRequest ——- 主要用于返回的数据类型是JsonObject的情况。
(c)JsonArrayRequest ——- 主要用于返回的数据类型是JsonArray的情况。
注:StringRequest是包含其他两种类型的,选择使用最合适最接近的类型可以提升性能。
2、生成请求对象
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
//成功的接口回调
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
//失败的接口回调
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this,volleyError.toString(), Toast.LENGTH_LONG).show();
}
});
3、创建请求队列,以便存放上面创建的请求
public class MyApplication extends Application {
private static RequestQueue queues;
@Override
public void onCreate() {
super.onCreate();
//实例化请求队列
queues = Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues(){
return queues;
}
}
注:还要在AndroidManifest.xml文件中的application标签中加入刚才新建的MyApplication。
android:name=".MyApplication"
4、给请求设置tag标签
stringRequest.setTag("phone");
5、将请求加入请求队列
MyApplication.getHttpQueues().add(stringRequest);
二、Post请求的使用
Post请求的使用,绝大部分步骤是与Get请求是相同的,唯一的区别在于Get请求将要请求的参数以 ? + 键值对的方式接在链接之后,而Post请求需要重写其中的方法来传入参数,如下:
StringRequest str = new StringRequest(Request.Method.POST, url , new Response.Listener<String>() {
@Override
public void onResponse(String s) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<>();
map.put("apikey", apiKey);
map.put("method", "publish");
map.put("appkey", "5316bd7179b6570f2ca6e20b");
map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb");
map.put("topic", "test_topic");
map.put("msg", "this is one message");
return map;
}
};
上面我们都是只介绍了StringRequest类,假设我们返回的是JsonObject类型的数据,我们采用JsonObjectRequest类呢,其实大部分参数还是不变的,只是她的构造函数多了一个JsonObject类型的参数,用于传入需要POST的数据,如果是Get方式,则直接传入null,下面是一个简单的例子:
private void volleyPost() {
final String apiKey = "f04a61e";
String url = "http://apis.baidu.com/yunba/realtime_restful_api/publish";
Map<String, String> map = new HashMap<>();
map.put("apikey", apiKey);
map.put("method", "publish");
map.put("appkey", "5316bd7179b6570f2ca6e20b");
map.put("seckey", "sec-qaAQOCmuFL22b0mv78hcOEyc9DzB9q0zesIfBAereaN6FAcb");
map.put("topic", "test_topic");
map.put("msg", "this is one message");
JSONObject json = new JSONObject(map);
JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, json, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
Toast.makeText(MainActivity.this, "DD" + jsonObject.toString(), Toast.LENGTH_LONG).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this, "F" + volleyError.toString(), Toast.LENGTH_LONG).show();
}
});
jsonRequest.setTag("xiao");
MyApplication.getHttpQueues().add(jsonRequest);
}
注:我们还应该在Activity的生命周期结束时,结束网络请求,所以我们需要在Activity的onStop()方法中添加如下一句:
MyApplication.getHttpQueues().cancelAll("tag");
三、使用Volley加载网络图片
Volley中加载网络图片有很多种方式:
1、使用ImageRequest加载网络图片
ImageRequest加载网路图片的方式和Volley中进行一般的网络请求差别不大,只是参数略有不同。参数依次为图片url、请求成功的回调、图片的最大宽度,最大高度(此处传入0则是用原始尺寸解码显示,传入其他数据则按比例进行缩放解码)、图片的缩放类型、图片的显示配置、请求失败的回调。下面是一个简单的例子:
/**
* 网络请求并设置图片
*/
private void setImage() {
String url =
ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, ImageView.ScaleType.CENTER_INSIDE, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
imageView.setBackgroundResource(R.mipmap.ic_launcher);
}
});
request.setTag("image");
MyApplication.getHttpQueues().add(request);
}
注:图片的网路请求还是和前面一样需要设置tag,再加入请求队列中。
2、使用 LruCache、ImageCache和ImageLoader结合加载网络图片
我可以先定义一个类用于实现ImageCache,在其中结合LruCache完成对图片的缓存,这个类的实例将作为后面的参数传入。
public class BitmapCache implements ImageLoader.ImageCache {
public LruCache<String, Bitmap> cache;
//最大缓存为10M,当缓存大于设定值时将自动启动垃圾回收
public int max = 10 * 1024 * 1024;
public BitmapCache(){
//实例化cache
cache = new LruCache<String, Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
//返回缓存中的图片
return cache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
cache.put(s, bitmap);
}
}
接下来我们需要获得ImageLoader的实例
//创建ImageLoader的实例(参数依次为请求队列和图片缓存)
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
接着我们需要获得图片加载监听类的实例
imageView = (ImageView) findViewById(R.id.show_image);
//创建图片加载监听实例(参数依次为图片显示控件实例,默认显示的图片的id,加载出错时显示的图片的id)
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher);
最后我们传入相应的参数来加载图片
String url = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1472736685&di=ea36b0007865cef24d9d659c03b26485&src=http://img.sucai.redocn.com/attachments/images/201002/20100206/20100206_c3f11163684180e389c57LUEUjSMDaax.jpg";
loader.get(url, listener);
3、使用Volley自带的NetworkImageView结合ImageLoader进行图片加载
首先获得ImageLoader的实例
//创建ImageLoader的实例(参数依次为请求队列和图片缓存)
ImageLoader loader = new ImageLoader(MyApplication.getHttpQueues(), new BitmapCache());
获得NetworkImageView的实例并设置简单的参数
//设置默认显示的图片 netImageview.setDefaultImageResId(R.mipmap.ic_launcher);
//设置加载错误时需要显示的图片 netImageview.setErrorImageResId(R.mipmap.ic_launcher);
最后设置需要加载的图片
//设置需要加载的图片
netImageview.setImageUrl(url, loader);
以上就是我在学习Volley的过程中的一个简单的记录总结。