Android系统中图片一般用Bitmap对象表示,它支持png,jpg等常见格式。通常情况下图片的体积都比较大,单个应用允许使用的内存又是有限的,所以我们需要采取一些手段减少内存占用并提高加载速度。 1、图片加载 SDK提供了BitmapFactory类供我们加载图片,常用的方法有这么几个: BitmapFactory.decodeFile :从文件加载。 BitmapFactory.decodeByteArray :从字节数组加载。 BitmapFactory.decodeStream :从输入流加载。 BitmapFactory.decodeResource :从 在Android开发中,Bitmap对象是用于表示图像的主要方式,支持多种格式如png和jpg。由于图片文件通常较大,而每个应用程序可用的内存有限,因此在处理Bitmap时需要优化内存使用和加载速度。以下是对Bitmap加载和缓存策略的详细解释。 1. **Bitmap加载** Android SDK提供BitmapFactory类来加载图片。常见的加载方法包括: - `BitmapFactory.decodeFile`: 从本地文件路径加载Bitmap。 - `BitmapFactory.decodeByteArray`: 从字节数组加载,常用于网络下载的图片数据。 - `BitmapFactory.decodeStream`: 从InputStream加载,如从网络流或文件流中读取。 - `BitmapFactory.decodeResource`: 从资源文件(如res/drawable)加载,适用于应用内部的图片资源。 为了减小内存占用,可以利用BitmapFactory.Options的`inSampleSize`参数进行下采样。当`inSampleSize`为2时,图片的宽度和高度将缩小至原来的一半,内存占用则变为原来的四分之一。以下是一个示例代码,展示如何根据需求计算合适的`inSampleSize`: ```java public static Bitmap decodeSampleBitmapFromBytes(byte[] data) { final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // 先获取图片原始信息 BitmapFactory.decodeByteArray(data, 0, data.length, options); int outWidth = options.outWidth; int outHeight = options.outHeight; int targetSize = Math.max(outWidth, outHeight); // 根据需求计算目标大小 options.inSampleSize = calculateSampleSize(targetSize, options.outWidth, options.outHeight); options.inJustDecodeBounds = false; // 开始加载图片 return BitmapFactory.decodeByteArray(data, 0, data.length, options); } private static int calculateSampleSize(int targetSize, int srcWidth, int srcHeight) { // 计算合适的采样比例 } ``` 2. **图片缓存** 为了提高加载速度和减少服务器负载,通常会采用两级缓存机制:内存缓存和磁盘缓存。 - **LruCache** 是Android提供的内存缓存实现,基于LinkedHashMap。我们需要确定缓存的最大容量,通常是设备总内存的八分之一。然后,我们需要重写`sizeOf`方法以计算每个Bitmap对象的内存占用。LruCache会自动维护最近最少使用的元素,当达到最大容量时,最近未使用的元素会被移除。基本使用如下: ```java int maxMemory = (int) (Runtime.getRuntime().totalMemory() / 1024); int cacheSize = maxMemory / 8; LruCache<String, Bitmap> mMemoryCache = new LruCache<>(cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; ``` - **DiskLruCache** 用于磁盘缓存,也是基于LRU算法。相比LruCache,DiskLruCache操作文件,所以使用起来相对复杂。它会在磁盘上创建一个目录结构,存储键值对,当达到预设的磁盘空间限制时,也会根据LRU原则删除旧的文件。DiskLruCache的使用通常需要更多的初始化和文件操作。 在实际应用中,我们通常会结合使用这两个缓存,先尝试从内存中获取图片,若不存在,则从磁盘加载,如果磁盘中也不存在,再从网络或其他来源获取。在图片加载库如 Glide 或 Picasso 中,这些缓存策略已经集成并封装好,开发者可以直接使用。 理解并有效运用Bitmap的加载和缓存策略对于优化Android应用的性能至关重要。通过合理地使用BitmapFactory的选项和缓存机制,可以在保证用户体验的同时,避免因内存不足导致的应用崩溃。
- 粉丝: 4
- 资源: 921
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助