Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 531|回复: 0

[默认分类] Android Volley使用之二:Volley请求网络图片

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-7 16:17:21 | 显示全部楼层 |阅读模式

    一、ImageRequest
    StringRequest和JsonRequest都是继承Request的,ImageRequest也是继承Request的,因此他们的用法基本相同,也是按照以下三步进行操作:
    1.创建一个RequestQueue对象
    2.创建Request对象
    3.将Request对象添加到RequestQueue队列里
    1. <span style="font-size:14px;">private void Vollry_GetImage() {
    2.         //第一个参数:图片Url
    3.         //第二个参数:成功回调,Bitmap类型
    4.         /*
    5.             第三、第四个参数:指定允许图片最大的宽度和高度
    6.             如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,
    7.             如果指定成0的话就表示不管图片有多大,都不会进行压缩。
    8.         */
    9.         /*
    10.             第五个参数用于指定图片的颜色属性
    11.             Bitmap.Config下的几个常量都可以在这里使用,
    12.             ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,
    13.             RGB_565则表示每个图片像素占据2个字节大小。
    14.         */
    15.         //第六个参数:出错回调,显示提示图片
    16.         String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
    17.         ImageRequest imageRequest = new ImageRequest(
    18.                 imgUrl,
    19.                 new Response.Listener<Bitmap>() {
    20.                     @Override
    21.                     public void onResponse(Bitmap response) {
    22.                         imageView.setImageBitmap(response);
    23.                     }
    24.                 },
    25.                 0,
    26.                 0,
    27.                 Bitmap.Config.RGB_565,
    28.                 new Response.ErrorListener() {
    29.                     @Override
    30.                     public void onErrorResponse(VolleyError error) {
    31.                         imageView.setImageResource(R.mipmap.ic_launcher);
    32.                     }
    33.                 });
    34.         MyApplication.getHttpQueues().add(imageRequest);
    35.     }</span>
    复制代码
    二、
    ImageLoader


    ImageLoader也可以用于加载网络图片,它的内部是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。由于ImageLoader不是继承自Request的,所以它的用法也和之前的内容有所不同,大致可以分为四步:

      1.创建RequestQueue对象


      2.创建ImageLoder对象


      3.获取ImageListener对象


      4.调用ImageLoder的get方法加载网络图片


      
    1. private void Vollry_GetImageLoader() {
    2.         String imgUrl = "http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
    3.         //可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求.
    4.         //第一个参数:RequestQueue对象
    5.         //第二个参数:ImageCache对象
    6.         ImageLoader imageLoader = new ImageLoader(
    7.                 MyApplication.getHttpQueues(),
    8.                 new BitmapCache()
    9.         );
    10.         // 第一个参数:用于显示图片的ImageView控件,
    11.         // 第二个参数:加载图片过程显示的图片,
    12.         // 第三个参数:加载图片失败显示的图片。
    13.         ImageLoader.ImageListener listener = ImageLoader.getImageListener(
    14.                 imageView,
    15.                 R.mipmap.ic_launcher,
    16.                 R.mipmap.ic_launcher
    17.         );
    18.         //第一个参数:图片的URL地址,
    19.         //第二个参数:获取到的ImageListener对象listener。
    20.         //第三个、四个参数是图片的最大宽度、高度
    21.         //imageLoader.get(imgUrl, listener);
    22.         imageLoader.get(imgUrl, listener, 500, 350);
    23. }
    复制代码
      这里我们新建一个BitmapCache并实现了ImageCache接口来缓存图片,用到了Android提供的LruCache功能
      

    1. /** Lru即Least Recently Used近期最少使用算法* LruCache是基于Lru算法实现的一种缓存机制* Lru算法原理是当内存缓存数据大于设定的最大值时,把近期最少使用的数据移除,有效避免OOM。* LruCache没有真正是释放内存,知识从Map中移除数据,真正释放内存还要用户手动释放** */public class BitmapCache implements ImageLoader.ImageCache {    final int memoryCache = MyApplication.getMemoryCacheSize();    //Url,图片    private LruCache<String, Bitmap> myCache;    public BitmapCache() {        //通过构造方法初始化缓存最大值,KB为单位        myCache = new LruCache<String, Bitmap>(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类添加了下面方法:
      
      
      
    1. <span style="font-size:14px;">public static int getMemoryCacheSize() {
    2.         //为了全局调用,在Application类中定义了cache大小的方法,官方建议取当前app可用内存的1/8。
    3.         final int memClass = (int) (Runtime.getRuntime().maxMemory())/1024;
    4.         return memClass / 8;
    5.     }</span>
    复制代码
       

      
      三、
      NetworkImageView


      NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并在原生的基础之上添加加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:



      1.创建RequestQueue对象


      2.创建一个ImageLoder对象


      3. 在xml布局文件中添加NetworkImageView控件,在java代码中获取该控件的实例。
    4. 设置要加载的图片地址和属性。


      
    1. <span style="font-size:14px;">public class Demo_NetworkImageView extends AppCompatActivity {
    2.     private NetworkImageView networkImageView;
    3.     @Override
    4.     protected void onCreate(Bundle savedInstanceState) {
    5.         super.onCreate(savedInstanceState);
    6.         setContentView(R.layout.demo_network_image_view);
    7.         networkImageView = (NetworkImageView) findViewById(R.id.Volley_NetworkImageView);
    8.         Vollry_NetworkImageView();
    9.     }
    10.     private void Vollry_NetworkImageView() {
    11.         String imgUrl="http://pic4.nipic.com/20091128/3426939_190849792510_2.jpg";
    12.         ImageLoader imageLoader = new ImageLoader(
    13.                 MyApplication.getHttpQueues(),
    14.                 new BitmapCache()
    15.         );
    16.         networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
    17.         networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
    18.         networkImageView.setImageUrl(
    19.                 imgUrl,
    20.                 imageLoader
    21.         );
    22.     }
    23. }
    24. </span>
    复制代码
      

      



      




      
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 08:02 , Processed in 0.431869 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表