在A(yíng)ndroid開(kāi)發(fā)中,存網(wǎng)緩存網(wǎng)絡(luò )圖片是絡(luò )圖一個(gè)常見(jiàn)的需求,本文ヽ(′ー`)ノ將介紹如何在A(yíng)ndroid中緩存網(wǎng)絡(luò )圖片,存網(wǎng)包括使用內存緩存和磁盤(pán)緩存。絡(luò )圖
(圖片來(lái)源網(wǎng)絡(luò ),存網(wǎng)侵刪)內存緩存是絡(luò )圖將圖片存儲在內存中,以便快速訪(fǎng)問(wèn),存網(wǎng)在A(yíng)nd??roid中,絡(luò )圖可以使用LruCach??e類(lèi)實(shí)現內存緩存,存網(wǎng)需要創(chuàng )建一個(gè)LruCache對象,絡(luò )圖并設置其大小,存網(wǎng)可以將圖片的絡(luò )圖URL作為鍵,將圖片的存網(wǎng)位圖作為值存儲在緩(′?`*)存中。
以下是絡(luò )圖創(chuàng )建LruCache對象的示例代碼:
private LruCache<String, Bitmap> memoryCache;void createMe??moryCache() { int maxSize = (int) Runtime.getRuntime().maxMemory() / 8; memoryCache = new LruCache<String, Bitmap>(maxSiz??e) { @Overri(′?`)de 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, bitm(╯‵□′)╯ap);}磁盤(pán)緩存
磁盤(pán)緩存是將(jiang)圖片存儲在磁盤(pán)上,以便在設備重啟后仍然可以訪(fǎng)問(wèn),在A(yíng)ndroid中,可以使用DiskLruC(′?_?`)ache類(lèi)實(shí)(shi)現磁盤(pán)緩存,需要創(chuàng )建一個(gè)DiskLru??Cach???e對象,并設置其大小??,可以將圖片的URL作為鍵,將圖片的字??節數組作為值存儲在(╥_╥)緩存(cun)中。
以下是(′▽?zhuān)?創(chuàng )建DiskLruCache對象的示例代碼:
private DiskL??ruCache diskLruCache;void cr( ?° ?? ?°)eateDiskCache(File cacheDir) { try { di??skLruCache = DiskLruCache.open="open"(cacheDir, 1, 1, 1024 * 1024 * 50);?? } catch (IOExcepti??on e) { e.printStackTrace(??); }}接下來(lái),可以從磁盤(pán)緩存中獲取圖片,如果不存在,則從網(wǎng)絡(luò )加載圖片并將其存儲在磁盤(pán)緩存中。
InputStream getInputStreamFromDiskCache(String url) { DiskLruCache.Snapshot snapShot = null; synchronized (diskLruCache) { snapShot = diskLruCache.get(url); } if (snapShot != null) { return snapShot.get??InputStream(0); } return null;??}void setInputStreamToDiskCac(/ω\)he(String url, InputStream inputStream) { DiskLruCache.Editor editor = null; synchronized (diskLruCache) { editor = diskLruCache.edit(url); } if (editor != null) { OutputStream outputStream = edito(′▽?zhuān)?)r.newOutputStream(0??); byte[] buffer = new byte[10??24]; int len; while ((len = inputStream.read(buffer)) != 1) { outputStream.w??rite(buffer, 0, len); } edito(′?`)r.commit(); }}結合內存(?_?;)緩存和磁盤(pán)緩存
為了提高性能,可以將內存緩存和磁盤(pán)緩存結合起來(lái)使用,嘗試從內存緩存中獲取圖片,如果不存在,則從磁盤(pán)緩存中獲取,如果仍然不存在,則┐(′д`)┌從網(wǎng)絡(luò )加載圖片,并將其存儲在內存緩存和磁盤(pán)緩存中。
以下是結合內存緩存和磁盤(pán)緩存的示例代碼:
public void loadImage(fi??nal String url, final ImageView imageView) { Bitmap bitmap = getBヾ(′?`)?itmapFrom?MemCache(url); if (bitmap == null( ?▽?)) { InputStream inputStream = getInputStre??amFro( ?ω?)mDiskCa(?????)che(url); if (inputStream == null) { downloadImage(url); } else { bitmap = BitmapFactory.decodeStream(inputStream); imageView.setImageBit??map(bitmap); setBitmapToMemCache(url, bitmap); se(′▽?zhuān)?tInputStreamToD(′ω`)iskCache(url, inputStream); } } else { imageView.setImageBitmap(bitmap); }}相??關(guān)問(wèn)答FAQs
Q1: 為什么需要使用緩存?
A1: 使用緩存可以避免重復從網(wǎng)絡(luò )加載相同的圖片,從而提高性能和減少流量消耗。
Q2: 如何選擇合(he)適的緩存大???
A2: 選擇合適的緩存大小取決于設備的可用內存和存儲空間,可以根據設備的硬件配置和應用場(chǎng)景來(lái)調整緩存( ?ヮ?)大小,以達到最佳性能和資源利用率。