Android 开发中如何缓存网络图片:内存缓存与磁盘缓存详解
在开发中,缓存网路图片是一个常见的需求,本文将介绍怎样在中缓存网路图片,包括使用显存缓存和c盘缓存。
(图片来源网路,侵删)
显存缓存
显存缓存是将图片储存在显存中,便于快速访问,在中,可以使用类实现显存缓存,须要创建一个对象,并设置其大小,可以将图片的URL作为键,将图片的位图作为值储存在缓存中。
以下是创建对象的示例代码:
private LruCache memoryCache;void createMemoryCache() { int maxSize = (int) Runtime.getRuntime().maxMemory() / 8; memoryCache = new LruCache(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getByteCount() / 1024; } };}
接出来,可以从显存缓存中获取图片,假若不存在,则从网路加载图片并将其储存在显存缓存中。
Bitmap getBitmapFromMemCache(String url) { return memoryCache.get(url);}void setBitmapToMemCache(String url, Bitmap bitmap) { memoryCache.put(url, bitmap);}
c盘缓存
c盘缓存是将图片储存在c盘上,便于在设备重启后依然可以访问,在中,可以使用类实现c盘缓存,须要创建一个对象,并设置其大小,可以将图片的URL作为键,将图片的字节链表作为值储存在缓存中。
以下是创建对象的示例代码:
private DiskLruCache diskLruCache;void createDiskCache(File cacheDir) { try { diskLruCache = DiskLruCache.open(cacheDir, 1, 1, 1024 * 1024 * 50); } catch (IOException e) { e.printStackTrace(); }}
接出来,可以从c盘缓存中获取图片,假如不存在,则从网路加载图片并将其储存在c盘缓存中。
InputStream getInputStreamFromDiskCache(String url) { DiskLruCache.Snapshot snapShot = null; synchronized (diskLruCache) { snapShot = diskLruCache.get(url); } if (snapShot != null) { return snapShot.getInputStream(0); } return null;}void setInputStreamToDiskCache(String url, InputStream inputStream) { DiskLruCache.Editor editor = null; synchronized (diskLruCache) { editor = diskLruCache.edit(url); } if (editor != null) { OutputStream outputStream = editor.newOutputStream(0); byte[] buffer = new byte[1024]; int len; while ((len = inputStream.read(buffer)) != 1) { outputStream.write(buffer, 0, len); } editor.commit(); }}
结合显存缓存和c盘缓存
为了提升性能,可以将显存缓存和c盘缓存结合上去使用,尝试从显存缓存中获取图片,假如不存在,则从c盘缓存中获取,假如依然不存在,则从网路加载图片,并将其储存在显存缓存和c盘缓存中。
以下是结合显存缓存和c盘缓存的示例代码:
public void loadImage(final String url, final ImageView imageView) { Bitmap bitmap = getBitmapFromMemCache(url); if (bitmap == null) { InputStream inputStream = getInputStreamFromDiskCache(url); if (inputStream == null) { downloadImage(url); } else { bitmap = BitmapFactory.decodeStream(inputStream); imageView.setImageBitmap(bitmap); setBitmapToMemCache(url, bitmap); setInputStreamToDiskCache(url, inputStream); } } else { imageView.setImageBitmap(bitmap); }}
相关问答FAQs
Q1:为何须要使用缓存?
A1:使用缓存可以防止重复从网路加载相同的图片,因而提升性能和减轻流量消耗。
Q2:怎样选择合适的缓存大小?
A2:选择合适的缓存大小取决于设备的可用显存和储存空间,可以按照设备的硬件配置和应用场景来调整缓存大小,以达到最佳性能和资源借助率。