Android(安卓)Volley使用之二:Volley请求网络图片
一、ImageRequest
StringRequest和JsonRequest都是继承Request的,ImageRequest也是继承Request的,因此他们的用法基本相同,也是按照以下三步进行操作:
1.创建一个RequestQueue对象
2.创建Request对象
3.将Request对象添加到RequestQueue队列里
private void Vollry_GetImage() { //第一个参数:图片Url //第二个参数:成功回调,Bitmap类型 /* 第三、第四个参数:指定允许图片最大的宽度和高度 如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩, 如果指定成0的话就表示不管图片有多大,都不会进行压缩。 */ /* 第五个参数用于指定图片的颜色属性 Bitmap.Config下的几个常量都可以在这里使用, ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小, RGB_565则表示每个图片像素占据2个字节大小。 */ //第六个参数:出错回调,显示提示图片 String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg"; ImageRequest imageRequest = new ImageRequest( imgUrl, new Response.Listener() { @Override public void onResponse(Bitmap response) { imageView.setImageBitmap(response); } }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { imageView.setImageResource(R.mipmap.ic_launcher); } }); MyApplication.getHttpQueues().add(imageRequest); }
二、ImageLoader
ImageLoader也可以用于加载网络图片,它的内部是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader不是继承自Request的,所以它的用法也和之前的内容有所不同,大致可以分为四步:
1.创建RequestQueue对象
2.创建ImageLoder对象
3.获取ImageListener对象
4.调用ImageLoder的get方法加载网络图片
private void Vollry_GetImageLoader() { String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg"; //可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求. //第一个参数:RequestQueue对象 //第二个参数:ImageCache对象 ImageLoader imageLoader = new ImageLoader( MyApplication.getHttpQueues(), new BitmapCache() ); // 第一个参数:用于显示图片的ImageView控件, // 第二个参数:加载图片过程显示的图片, // 第三个参数:加载图片失败显示的图片。 ImageLoader.ImageListener listener = ImageLoader.getImageListener( imageView, R.mipmap.ic_launcher, R.mipmap.ic_launcher ); //第一个参数:图片的URL地址, //第二个参数:获取到的ImageListener对象listener。 //第三个、四个参数是图片的最大宽度、高度 //imageLoader.get(imgUrl, listener); imageLoader.get(imgUrl, listener, 500, 350);}
这里我们新建一个BitmapCache并实现了ImageCache接口来缓存图片,用到了Android提供的LruCache功能
/** Lru即Least Recently Used近期最少使用算法* LruCache是基于Lru算法实现的一种缓存机制* Lru算法原理是当内存缓存数据大于设定的最大值时,把近期最少使用的数据移除,有效避免OOM。* LruCache没有真正是释放内存,知识从Map中移除数据,真正释放内存还要用户手动释放** */public class BitmapCache implements ImageLoader.ImageCache { final int memoryCache = MyApplication.getMemoryCacheSize(); //Url,图片 private LruCache myCache; public BitmapCache() { //通过构造方法初始化缓存最大值,KB为单位 myCache = new LruCache(memoryCache) { //重写sizeOf方法衡量每张图片大小,默认返回的是图片数量 @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; } @Override public Bitmap getBitmap(String s) { return myCache.get(s); } @Override public void putBitmap(String s, Bitmap bitmap) { myCache.put(s, bitmap); }}
这里,final int memoryCache = MyApplication.getMemoryCacheSize();在MyApplication类添加了下面方法:
public static int getMemoryCacheSize() { //为了全局调用,在Application类中定义了cache大小的方法,官方建议取当前app可用内存的1/8。 final int memClass = (int) (Runtime.getRuntime().maxMemory())/1024; return memClass / 8;}
三、NetworkImageView
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并在原生的基础之上添加加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
1.创建RequestQueue对象
2.创建一个ImageLoder对象
3. 在xml布局文件中添加NetworkImageView控件,在java代码中获取该控件的实例。
4. 设置要加载的图片地址和属性。
public class Demo_NetworkImageView extends AppCompatActivity { private NetworkImageView networkImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.demo_network_image_view); networkImageView = (NetworkImageView) findViewById(R.id.Volley_NetworkImageView); Vollry_NetworkImageView(); } private void Vollry_NetworkImageView() { String imgUrl="http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg"; ImageLoader imageLoader = new ImageLoader( MyApplication.getHttpQueues(), new BitmapCache() ); networkImageView.setDefaultImageResId(R.mipmap.ic_launcher); networkImageView.setErrorImageResId(R.mipmap.ic_launcher); networkImageView.setImageUrl( imgUrl, imageLoader ); }}
更多相关文章
- ios开发答疑录系列---(一)Android和IOS图片编码之跨平台传递
- Android之GridView视图实现
- android paint画笔 设置透明度setAlpha及 canvas画布
- Android获取View的内容图片
- android选择一张本机图片
- 系统相册分析(GallerPicker)
- android几种图像之间转换
- Android(安卓)AIDL使用详解
- Android中的文件下载