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

 

 

你可能感兴趣的:(Android)