Volley使用
参考博客
郭神 http://blog.csdn.net/guolin_blog/article/details/17482165
http://www.cnblogs.com/zyw-205520/p/4950357.html
- 设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
- 自动调度网络请求
- 多个并发的网络连接
- 通过使用标准的HTTP缓存机制保持磁- 盘和内存响应的一致
- 支持请求优先级
- 支持取消请求的强大API,可以取消单个请求或多个
- 易于定制
- 健壮性:便于正确的更新UI和获取数据
- 包含调试和追踪工具
Volley中的RequestQueue 和 Request
- RequestQueue 用来执行请求的请求队列
- Request 用来构造一个请求对象
- Request对象主要有以下几种类型:
- StringRequest 响应的主体为字符串
- JsonArrayRequest 发送和接收JSON数组
- JsonObjectRequest 发送和接收JSON对象
- ImageRequest 发送和接收Image
StringRequest
第一步 RequestQueue requestQueue = RequestQueueManager.getInstance(StringActivity.this);
第二步 StringRequest stringRequest = new StringRequest(
"https://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
tv_show.setText(s);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.e(TAG, "onErrorResponse: " + volleyError);
}
});
第三步 requestQueue.add(stringRequest);
RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
JsonObjectRequest
String url = "http://api.androidhive.info/volley/person_object.json";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject jsonObject) {
tv_object.setText(jsonObject.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
RequestQueueManager.getInstance(JsonObjectActivity.this).add(jsonObjectRequest);
ImageRequest 没有缓存的
ImageRequest imageRequest = new ImageRequest(
"http://img5.duitang.com/uploads/item/201409/14/20140914162144_MBEmX.jpeg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
iv.setImageBitmap(bitmap);
Log.e(TAG, "onResponse: " );
}
}, 0 , 0 , Bitmap.Config.RGB_565,
#这里的0 ,0 , Bitmap.Config.RGB_565,指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
iv.setImageResource(R.mipmap.ic_launcher);
Log.e(TAG, "onErrorResponse: " );
}
});
RequestQueueManager.getInstance(imageNoCacheActivity.this).add(imageRequest);
前面三个的操作基本上都一样
ImageLoader 缓存
ImageLoader imageLoader = new ImageLoader(RequestQueueManager.getInstance(imageCacheActivity.this),
new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv , R.drawable.de,R.drawable.error);
#第一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片
imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener);
}
private class BitmapCache implements ImageLoader.ImageCache{
private LruCache<String,Bitmap> mCache;
public BitmapCache(){
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
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);
}
}