Android开发利用Volley框架下载和缓存网络图片

2024-04-04 11:38

本文主要是介绍Android开发利用Volley框架下载和缓存网络图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      2013年Google I/O大会上推出了一种新的网络通信框架——Volley,Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。volley.jar下载

一.使用Volley框架下载网络图片

(1)首先,创建Application类,声明并且实例话RequestQueue。

App.java文件中:

public class App extends Application

{

     private static RequestQueuequeues;// Volley加载队列

     @Override

     public void onCreate()

     {

          super.onCreate();

          queues =Volley.newRequestQueue(getApplicationContext());// 实列话

     }

}

[注意]需要在AndroidManifest.xml中配置这个APP类:

<application

       android:name=".App"

       android:allowBackup="true"

       android:icon="@drawable/ic_launcher"

       android:label="@string/app_name"

       android:theme="@style/AppTheme">

...........

</application>

(2)在需要下载图片的地方,使用Volley框架进行网络操作(如ListView的Adapter中,在getView方法中可以使用)

ImageView iv = (ImageView)findViewById(R.id.iv);

String url = "http://.............../test.png"  // 图片的地址

ImageRequest request =new ImageRequest(url,new Listener<Bitmap>()

{

     @Override

     public void onResponse(Bitmap response)

     {// 加载成功,显示头像

          iv.setImageBitmap(response);

     }

},0,0,Config.RGB_565,new ErrorListener()

{

     @Override

     public void onErrorResponse(VolleyError error)

     { // 加载出错调用的函数

          iv.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.error));

     }

});

if (! url.equals(""))

{     

      App.getHttpQueue().add(request);

}

[说明]

Volley.ImageRequest(String url,Listener<Bitmap> listener, int maxWidth, int maxHeight,Config decodeConfig,ErrorListener errorListener)

url:为图片下载的地址;

listener:为下载成功的监听, 其onResponse方法中的Bitmap对象就是获得成功之后得到的图片(Bitmap response);

maxWidth与maxHeight:与系统对图片处理(压缩和拉伸),若设置为0,则系统不对图片进行这些处理;

errorListener:拉取图片出错的监听。

[注意]上面的方法,实现了数量不大,但频繁的网络加载图片的操作,可以用在ListView图片加载以及单一图片加载的过程,但是有一个缺点,比如在ListView中加载,会加载当前现实的ListView的Item的图片,上下滑动的过程中,对于显示出的Item,会重现进行网络下载,这样就浪费了流量,因此我们需要结合图片缓存机制和Volley一起进行网络图片加载使用。


二.Volley框架+BitmapCache进行网络图片加载和缓存

(1)首先,创建Application类,声明并且实例话RequestQueue。

APP.java文件中:

public class APP extends Application

{

     private static RequestQueue queues// Volley加载队列

     @Override

     public void onCreate()

     {

          super.onCreate();

          queues = Volley.newRequestQueue(getApplicationContext()); // 实列话

     }

}

[注意]需要在AndroidManifest.xml中配置这个APP类:

<application

        android:name=".App"

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppTheme" >

...........

</application>

(2).创建图片缓存类BitmapCache.java(借助了LruCache实现缓存)

import android.graphics.Bitmap;

import android.support.v4.util.LruCache;


import com.android.volley.toolbox.ImageLoader.ImageCache;


//用来图片缓存的类

public class BitmapCache implements ImageCache

{


     public LruCache<String,Bitmap>cache;

     public int max =10 *1024 *1024;// 设置缓存的最大为10M


     public BitmapCache()

     {

          cache =new LruCache<String,Bitmap>(max)

          {

               @Override

               protected int sizeOf(String key,Bitmap value)

               {

                    return value.getRowBytes() *value.getHeight();

               }

          };

}


     @Override

     public Bitmap getBitmap(String url)

     {

          returncache.get(url);

     }


     @Override

     public void putBitmap(String url,Bitmap bitmap)

     {

          cache.put(url,bitmap);

     }

}


(3)调用Volley进行下载和缓存图片:

String url = "http://.........../test.png";

ImageView img = (ImageView)findViewById(R.id.img);

ImageLoader loader =new ImageLoader(App.getHttpQueue(),new BitmapCache());

ImageListener listener =ImageLoader.getImageListener(img,R.drawable.default_icon,R.drawable.error_icon);

loader.get(url, listener);


<注意>上面的操作由于需要网络支持,以及会在内存中读写内容,因此需要在AndroidManifest.xml中加入必要的操作权限:

<uses-permissionandroid:name="android.permission.INTERNET"/>

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


这篇关于Android开发利用Volley框架下载和缓存网络图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875683

相关文章

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

2025最新版Android Studio安装及组件配置教程(SDK、JDK、Gradle)

《2025最新版AndroidStudio安装及组件配置教程(SDK、JDK、Gradle)》:本文主要介绍2025最新版AndroidStudio安装及组件配置(SDK、JDK、Gradle... 目录原生 android 简介Android Studio必备组件一、Android Studio安装二、A

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2

Python包管理工具uv下载python版本慢问题解决办法

《Python包管理工具uv下载python版本慢问题解决办法》uv是一个非常快的Python包和项目管理器,用Rust编写,使用热缓存安装Trio的依赖项的速度对比,:本文主要介绍Python包... 目录发现问题对于 MACOS / linux 用户 (zsh/bash):对于 Windows 用户:总

利用Python将PDF文件转换为PNG图片的代码示例

《利用Python将PDF文件转换为PNG图片的代码示例》在日常工作和开发中,我们经常需要处理各种文档格式,PDF作为一种通用且跨平台的文档格式,被广泛应用于合同、报告、电子书等场景,然而,有时我们需... 目录引言为什么选择 python 进行 PDF 转 PNG?Spire.PDF for Python

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码