一、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        );    }}

 

 

更多相关文章

  1. ios开发答疑录系列​---(一)Android和IOS图片编码之跨平台传递
  2. Android之GridView视图实现
  3. android paint画笔 设置透明度setAlpha及 canvas画布
  4. Android获取View的内容图片
  5. android选择一张本机图片
  6. 系统相册分析(GallerPicker)
  7. android几种图像之间转换
  8. Android(安卓)AIDL使用详解
  9. Android中的文件下载

随机推荐

  1. 【Android】Android(安卓)联系人数据库浅
  2. 第一次写博客,先上传一下平常开发android
  3. Android(安卓)中屏幕点击事件的实现
  4. Android(安卓)Studio v0.1尝鲜
  5. java websocket client ssl(wss)
  6. ADT在线安装(http://dl-ssl.google.com/an
  7. android之interpolator的用法详解
  8. Android(安卓)ListView
  9. android 去掉listview之间的黑线
  10. Android(安卓)动画的重复播放