从网络到缓存:在Android中高效管理图片加载

文章目录

    • 在Android应用中实现图片缓存和下载
      • 项目结构
        • 使用
      • 代码解析
      • 关键功能解析
        • 1. 图片加载方法
        • 2. 下载图片
        • 3. 保存图片到缓存
        • 4. 文件名提取
    • 或者通过学习glide

首先我们需要在配置AndroidManifest.xml里面添加

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

在Android应用中实现图片缓存和下载

在现代移动应用开发中,用户体验至关重要,特别是在图像加载方面。为了提高应用的响应速度和减少网络流量,我们通常采用缓存机制来存储下载的图片。本文将介绍如何在Android中实现一个简单的图片缓存加载器,允许从网络下载图片并缓存到本地。

项目结构

我们将构建一个名为 ImageCacheLoader 的类,该类负责从URL加载图片,并首先检查本地缓存。如果缓存不存在,则从网络下载图片。

使用
package com.example.dowhttppic;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;import android.os.Bundle;
import android.widget.ImageView;
import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ImageView imageView;private ImageCacheLoader imageCacheLoader;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);imageView = findViewById(R.id.imageView);// 初始化 ImageCacheLoaderimageCacheLoader = new ImageCacheLoader(this);// 加载图片String imageUrl = "图片链接";imageCacheLoader.loadImage(imageUrl, imageView);}
}

代码解析

package com.example.dowhttppic;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.widget.ImageView;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class ImageCacheLoader {private Context context;private Handler handler = new Handler(); // 用于处理UI线程更新// 构造函数,接收上下文public ImageCacheLoader(Context context) {this.context = context;}// 公共方法:加载图片,首先从缓存读取,如果没有则通过网络下载public void loadImage(final String url, final ImageView imageView) {// 获取缓存目录File cacheDir = context.getCacheDir();String fileName = getFileNameFromUrl(url);final File imageFile = new File(cacheDir, fileName);// 如果本地有缓存,直接加载本地图片if (imageFile.exists()) {Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());imageView.setImageBitmap(bitmap);} else {// 启动线程下载图片并缓存new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = downloadImage(url);if (bitmap != null) {saveImageToCache(imageFile, bitmap);// 更新UI,需在主线程中执行handler.post(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(bitmap);}});} else {// 超时或下载失败时显示默认图片handler.post(new Runnable() {@Overridepublic void run() {imageView.setImageResource(R.drawable.no_image_dow_http);}});}}}).start();}}// 从网络下载图片,添加超时机制private Bitmap downloadImage(String urlString) {Bitmap bitmap = null;try {URL url = new URL(urlString);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000); // 设置连接超时为5秒connection.setReadTimeout(5000); // 设置读取超时为5秒connection.connect();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();bitmap = BitmapFactory.decodeStream(inputStream);inputStream.close();}} catch (Exception e) {e.printStackTrace();}return bitmap;}// 将下载的图片保存到本地缓存private void saveImageToCache(File imageFile, Bitmap bitmap) {try {OutputStream outputStream = new FileOutputStream(imageFile);bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {e.printStackTrace();}}// 根据URL提取文件名private String getFileNameFromUrl(String url) {return url.substring(url.lastIndexOf("/") + 1);}
}

关键功能解析

1. 图片加载方法

loadImage 方法是该类的核心,它负责加载指定URL的图片。首先,它尝试从本地缓存读取图片,如果缓存存在,则直接使用缓存的图片;如果不存在,则启动一个新线程下载图片。

public void loadImage(final String url, final ImageView imageView) {File cacheDir = context.getCacheDir();String fileName = getFileNameFromUrl(url);final File imageFile = new File(cacheDir, fileName);if (imageFile.exists()) {Bitmap bitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());imageView.setImageBitmap(bitmap);} else {new Thread(new Runnable() {@Overridepublic void run() {Bitmap bitmap = downloadImage(url);if (bitmap != null) {saveImageToCache(imageFile, bitmap);handler.post(new Runnable() {@Overridepublic void run() {imageView.setImageBitmap(bitmap);}});} else {handler.post(new Runnable() {@Overridepublic void run() {imageView.setImageResource(R.drawable.no_image_dow_http);}});}}}).start();}
}
2. 下载图片

downloadImage 方法使用 HttpURLConnection 从给定URL下载图片。它设置了连接和读取的超时,以避免长时间等待。

private Bitmap downloadImage(String urlString) {Bitmap bitmap = null;try {URL url = new URL(urlString);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setConnectTimeout(5000);connection.setReadTimeout(5000);connection.connect();int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();bitmap = BitmapFactory.decodeStream(inputStream);inputStream.close();}} catch (Exception e) {e.printStackTrace();}return bitmap;
}
3. 保存图片到缓存

saveImageToCache 方法将下载的图片以PNG格式保存到应用的缓存目录中。

private void saveImageToCache(File imageFile, Bitmap bitmap) {try {OutputStream outputStream = new FileOutputStream(imageFile);bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {e.printStackTrace();}
}
4. 文件名提取

getFileNameFromUrl 方法从图片URL中提取文件名,以便在缓存中使用。

private String getFileNameFromUrl(String url) {return url.substring(url.lastIndexOf("/") + 1);
}

或者通过学习glide

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react-router与react-router-dom的区别

写法上的区别&#xff1a; 写法1: import {Swtich, Route, Router, HashHistory, Link} from react-router-dom;写法2: import {Switch, Route, Router} from react-router; import {HashHistory, Link} from react-router-dom;react-router实现了路由的核心功能 react-router-…

如何在C下比较两个字符串是否相同?

strcmp函数 strcmp函数是C标准库中用于比较两个字符串的函数。它的原型定义在string.h头文件中 函数原型&#xff1a; int strcmp(const char *str1, const char *str2); str1 和 str2 是两个要比较的字符串。返回值为整数类型&#xff1a; 如果返回值为0&#xff0c;表示两…

为数据集而生的 SQL 控制台

随着数据集的使用量急剧增加&#xff0c;Hugging Face 社区已经变成了众多数据集默认存放的仓库。每月&#xff0c;海量数据集被上传到社区&#xff0c;这些数据集亟需有效的查询、过滤和发现。 Dataset Monthly Creations 每个月在 Hugging Face Hub 创建的数据集 我们现在非常…

modelscope下载Qwen2.5 72B 模型方法

conda create -n modelscope python=3.10 conda activate modelscopepip install modelscope执行这个python代码: from modelscope.hub.snapshot_download import snapshot_download# 下载模型到当前路径 model_dir = snapshot_download(

【Git】如何在 Git 中高效合并分支:完整指南

目录 引言1. 切换到主分支1.1 切换分支命令1.2 相关命令1.3 切换分支示意图 2. 合并分支2.1 基本合并命令2.2 合并选项2.3 合并流程示意图 3. 解决冲突3.1 解决冲突的步骤3.2 相关命令3.3 解决冲突示意图 4. 本地更新分支4.1 拉取远程更改4.2 更新主分支4.3 拉取远程更新到本地…

2024年计算机视觉与图像处理国际学术会议 (CVIP 2024)

目录 大会简介 主办单位&#xff0c;协办单位 组委会 主讲嘉宾 征稿主题 参会方式 会议议程 重要信息 会议官网&#xff1a;iccvip.org 大会时间&#xff1a;2024年11月15日-17日 大会地点&#xff1a;中国 杭州 大会简介 2024年计算机视觉与图像处理国际学术会议(C…

【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加

当前内容所在位置&#xff1a; 第四章 直线、曲线与弧线的绘制 ✔️ 4.1 坐标轴的创建&#xff08;上篇&#xff09; 4.1.1 D3 中的边距约定&#xff08;中篇&#xff09;4.1.2 坐标轴的生成&#xff08;中篇&#xff09; 4.1.2.1 比例尺的声明&#xff08;中篇&#xff09;4.1…

使用 PyCharm 构建 FastAPI 项目:零基础入门 Web API 开发

使用 PyCharm 构建 FastAPI 项目&#xff1a;零基础入门 Web API 开发 本文提供了一份完整的 FastAPI 入门指南&#xff0c;涵盖从环境搭建、依赖安装到创建并运行一个简单的 FastAPI 应用的各个步骤。通过 FastAPI 和 Uvicorn&#xff0c;开发者可以快速构建现代化的 Web API…

通过AI进行大数据分析,提示广告投放效果,优衣库的AI实践

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共23款…

Python小白学习教程从入门到入坑------第二十四课 继承(语法进阶)

一、继承 继承就是让类和类之间转变为父子关系&#xff0c;子类默认继承父类的属性和方法 在Python中&#xff0c;继承是一个非常强大的特性&#xff0c;它允许我们创建一个新的类&#xff08;称为子类&#xff09;&#xff0c;这个新类可以继承另一个类&#xff08;称为父类…

【django】RESTful API 设计指南

目录 一、协议 二、域名 三、版本&#xff08;Versioning&#xff09; 四、路径&#xff08;Endpoint&#xff09; 五、HTTP动词 5.1 CRUD操作&#xff1a; 5.2 其他动词&#xff1a; 六、过滤信息&#xff08;Filtering&#xff09; 七、状态码&#xff08;Status Co…

【综合算法学习】(第十六篇)

目录 岛屿的最⼤⾯积&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 被围绕的区域&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 岛屿的最⼤⾯积&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xf…

django的一些文件

~~~settings.py~~~ # 接口文档相关配置 REST_FRAMEWORK{ DEFAULT_SCHEMA_CLASS: rest_framework.schemas.coreapi.AutoSchema, } ~~~urls.py~~~ from rest_framework.documentation import include_docs_urls # 模块coreapi,只针对drf的接口文档 path(api-docs/, i…

qt QTabWidget详解

1、概述 QTabWidget是Qt框架中的一个控件&#xff0c;它提供了一个标签页式的界面&#xff0c;允许用户在不同的页面&#xff08;或称为标签&#xff09;之间切换。每个页面都可以包含不同的内容&#xff0c;如文本、图像、按钮或其他小部件。QTabWidget非常适合用于创建具有多…

用ChatGPT提升工作效率:从理论到实际应用

伴人工智能技术的迅速演进&#xff0c;像ChatGPT这类语言模型已成为提升工作效率的关键工具。这类模型不仅具备处理海量数据的能力&#xff0c;还能自动化许多日常任务&#xff0c;从而提高决策的准确性。本文将深入探讨如何在工作中利用ChatGPT等AI工具提升效率&#xff0c;涵…

VScode调试

VScode只是一个代码编辑器&#xff0c;下面我们使用VScode调试运行在远端连接Linux服务器的代码。 打断点 编译代码&#xff0c;要确保已经安装gdb&#xff0c;可以使用指令gdb --version 来检查 GDB 是否已安装以及安装的版本&#xff0c;确认安装后在编译时要加上选项&…

成都睿明智科技有限公司正规吗靠谱吗?

在这个短视频风起云涌的时代&#xff0c;抖音电商以其独特的魅力&#xff0c;成为了无数商家竞相追逐的新蓝海。而在这片浩瀚的商海中&#xff0c;成都睿明智科技有限公司犹如一艘装备精良的航船&#xff0c;引领着众多企业破浪前行&#xff0c;探索抖音电商的无限可能。今天&a…

Web Broker(Web服务应用程序)入门教程(1)

1、介绍 Web Broker 组件&#xff08;位于工具面板的“Internet”选项卡中&#xff09;可以帮助您创建与特定统一资源标识符&#xff08;URI&#xff09;相关联的事件处理程序。当处理完成后&#xff0c;您可以通过编程方式构建 HTML 或 XML 文档&#xff0c;并将它们传输给客…

PySpark Yarn集群模式

目录 简介 一、PySpark简介 二、YARN模式概述 三、配置环境 1. 安装与配置Spark 2. 配置Hadoop和YARN 3. 启动yarn 四、编写PySpark脚本 五、提交PySpark作业到YARN 参数解释&#xff1a; 六、常见问题及解决 七、总结 简介 随着大数据的普及&#xff0c;Spark作为…