日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android中的緩存

瀏覽:33日期:2022-09-27 11:43:33

為什么會用到緩存呢?主要是流量耗不起啊,國內的公共場所的WiFi的普及率不高,因此必須考慮流量的問題,說白了,就是用戶體驗啊,每次都網絡請求,消耗資源不說,網速不好的情況下還會有網絡延時,用戶體驗不好。

Android中的緩存,從方式上來說,一般有網絡緩存,磁盤緩存即SD卡緩存,內存緩存。網絡緩存需要服務端的配合,用于加快網絡請求的響應速度。磁盤緩存一般用DiskLruCache,當然也可以用SqlLite數據庫,以及sharedpreference等作持久化處理。這里主要說下兩種常用的緩存方法,LruCache、DiskLruCache。前者用于內存緩存,后者用于設備緩存,一般兩者結合起來效果更好。

其實緩存的實現并不難,每一中緩存都會有三個基本操作,添加、獲取、刪除。了解這些了,就會有思路了。

再說LruCache、DiskLruCache,可以看到,兩者都有Lru,那么Lru是什么呢?這是目前常用的一種緩存算法:近期最少使用算法,核心思想很簡單,就是當緩存滿時,會優先刪除那些近期最少使用的緩存。那么現在分別了解下這兩種緩存吧。

LruCache

LruCache內部用到的是LinkedHashMap,LinkedHashMap與HashMap的不同住處在于LinkedHashMap 維護著一個運行于所有條目的雙重鏈接列表。此鏈接列表定義了迭代順序,該迭代順序可以是插入順序或者是訪問順序。也就說它的插入和訪問是有順序的。另外LruCache是線程安全的。至于使用的話就很簡單了。

// 初始化 int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap value) { return value.getRowBytes() * value.getHeight() / 1024;} };

總緩存大小一般會設置為當前進程可用內存的1/8,當然這個數是可以自己設置的,這個數是推薦的。sizeOf方法是為了計算緩存對象的大小。如果有必要也可以重寫entryRemoved來完成某些資源回收工作。

再看緩存的添加與刪除,

//添加緩存 mMemoryCache.put(key,bitmap); //獲取緩存 mMemoryCache.get(key); //刪除緩存 mMemoryCache.remove(key);DiskLruCache

DiskLruCache用與磁盤緩存,被官方推薦使用。下面來看看它的使用。

自從用了Gradle后,引入項目方便多了,誰用誰知道。

compile ’com.jakewharton:disklrucache:2.0.2’

創建DiskLruCache:

DiskLruCache mDiskLruCache = null; try { File cacheDir = getDiskCacheDir(context, 'bitmap'); if (!cacheDir.exists()) { cacheDir.mkdirs(); } mDiskLruCache = DiskLruCache.open(cacheDir, 1, 1, 10 * 1024 * 1024); } catch (IOException e) { e.printStackTrace(); }

解釋下DiskLruCache.open的參數,第一個表示存儲的路徑,第二個表示應用的版本號,注意這里當版本號發生改變時會清空之前所有的緩存文件,而在實際開發中這個性質用的不多,所以直接寫1。第三個表示單個節點對應的數據的個數,設置為1就可以了,第四個表示緩存的總大小,當超出這個值時,會清除一些緩存保證總大小不大于這個設定的值。

添加緩存:

第一步,網絡下載圖片(文件也是一樣的步驟的)并通過outputStream寫入到本地

private boolean downloadUrlToStream(String urlString, OutputStream outputStream) { HttpURLConnection urlConnection = null; BufferedOutputStream out = null; BufferedInputStream in = null; try { final URL url = new URL(urlString); urlConnection = (HttpURLConnection) url.openConnection(); in = new BufferedInputStream(urlConnection.getInputStream(), 8 * 1024); out = new BufferedOutputStream(outputStream, 8 * 1024); int b; while ((b = in.read()) != -1) { out.write(b); } return true; } catch (final IOException e) { e.printStackTrace(); } finally { if (urlConnection != null) { urlConnection.disconnect(); } try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (final IOException e) { e.printStackTrace(); } } return false; }

第二步,處理緩存的key,直接用url作為key值時最有快捷的方式,但是url里會有特殊字符,不符合Android的命名規范,最好的辦法就是把url進行MD5摘要。

public String hashKeyForDisk(String key) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance('MD5'); mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); } return cacheKey; } private String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]); if (hex.length() == 1) { sb.append(’0’); } sb.append(hex); } return sb.toString(); }

第三步 創建DiskLruCache.Editor的實例,寫入數據

String key = hashKeyForDisk(imageUrl); DiskLruCache.Editor editor = mDiskLruCache.edit(key); if (editor != null) { OutputStream outputStream = editor.newOutputStream(0); if (downloadUrlToStream(imageUrl, outputStream)) { editor.commit(); } else { editor.abort(); } } mDiskLruCache.flush();

editor.commit()方法用來提交寫入操作,editor.abort()回退整個操作。

讀取緩存:

Bitmap bitmap = null;String key = hashKeyFormUrl(url);DiskLruCache.Snapshot snapShot = mDiskLruCache.get(key); if (snapShot != null) { FileInputStream fileInputStream = (FileInputStream)snapShot.getInputStream(0); FileDescriptor fileDescriptor = fileInputStream.getFD(); bitmap = mImageResizer.decodeSampledBitmapFromFileDescriptor(fileDescriptor, reqWidth, reqHeight); if (bitmap != null) {addBitmapToMemoryCache(key, bitmap); }}

public Bitmap decodeSampledBitmapFromFileDescriptor(FileDescriptor fd, int reqWidth, int reqHeight) { // First decode with inJustDecodeBounds=true to check dimensions final BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;BitmapFactory.decodeFileDescriptor(fd, null, options); // Calculate inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth,reqHeight); // Decode bitmap with inSampleSize set options.inJustDecodeBounds = false; return BitmapFactory.decodeFileDescriptor(fd, null, options); }

需要說明下的是為了避免加載圖片時導致OOM,不建議直接加在Bitmap,通常我們會通過BitmapFactory.Options來加載一張縮放的圖片,但是這中方法對于FileInputStream有問題,因為FileInputStream是有序的文件流,而兩次的從的 decodeStream調用影響了文件流的位置屬性,導致第二次decodeStream時得到的為null。為了解決這個問題,可以先得到對應的文件描述符,然后通過BitmapFactory.decodeFileDescriptor()來加載圖片。

移除緩存:

mDiskLruCache.remove(key);

來自:http://www.jianshu.com/p/96a7865fdab4

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
麻豆久久一区二区| 91精品国产一区二区在线观看| yellow在线观看网址| 国产精品一页| 香蕉久久一区| 久久精品色播| 久久一区亚洲| 国产一区三区在线播放| 婷婷综合国产| 欧美精品影院| 日韩黄色在线观看| 国产不卡av一区二区| 亚洲精品一二三区区别| 国产高清日韩| 一级成人国产| 欧美激情福利| 蜜桃视频一区二区| 欧美日韩水蜜桃| 亚洲一区免费| 综合欧美精品| 中文另类视频| 国产一区二区三区四区大秀| 国产伦精品一区二区三区千人斩| 蜜桃tv一区二区三区| 欧美天堂视频| 日本一区中文字幕| 欧美日韩国产在线一区| 99久久夜色精品国产亚洲1000部| 麻豆精品视频在线观看视频| 国产一区二区三区国产精品| 91精品国产调教在线观看| 国产精品亚洲欧美日韩一区在线| 久久九九电影| 欧美成人午夜| 国产精品久久久久久久久免费高清| 水野朝阳av一区二区三区| 日韩av在线播放中文字幕| 在线视频观看日韩| 成人在线视频区| 久久久夜夜夜| 久久久久久久久久久妇女| 亚洲最大av| 亚洲视频二区| 中文字幕中文字幕精品| 日本不卡视频一二三区| 亚洲一级黄色| 国产激情在线播放| 欧美一区免费| 国产精品一级| 亚洲+小说+欧美+激情+另类| 最新日韩欧美| 国产毛片精品| 91久久中文| 蜜臀av在线播放一区二区三区| 日韩精选在线| 成人一区不卡| 热三久草你在线| 日韩av在线中文字幕| 日韩美女一区二区三区在线观看| 久久wwww| 日韩在线观看一区二区三区| 97视频热人人精品免费| 99国内精品| 日韩黄色av| 日韩一区二区三区精品| 性色av一区二区怡红| 国产精品亚洲人成在99www| 国产99久久久国产精品成人免费| 精品免费av一区二区三区| 精品视频在线观看网站| 激情久久一区二区| 亚洲精品中文字幕乱码| 欧美午夜三级| 亚洲精品美女| 伊人成人网在线看| 欧美xxxx中国| 午夜影院一区| 国产二区精品| 手机精品视频在线观看| 日韩成人午夜精品| 黄色在线观看www| 国内精品福利| 偷拍亚洲精品| 日本在线精品| 亚洲一区二区小说| 日韩高清不卡一区二区| 久久中文字幕二区| 在线天堂资源www在线污| 亚洲专区视频| 蜜桃成人av| 国产精品极品在线观看| 免费在线成人| 午夜一区在线| 日本激情一区| 亚洲精品国模| 92国产精品| 99热精品在线| 91欧美极品| 国产亚洲久久| 不卡一区2区| 亚洲我射av| 亚洲一区二区日韩| 日韩中文字幕不卡| 黄色亚洲大片免费在线观看| 欧美亚洲日本精品| 国产日韩1区| 国产亚洲高清一区| 99久久精品网| 午夜国产一区二区| 久久精品91| 国产精品99视频| 99成人在线| 亚洲一区二区三区免费在线观看| 久久最新视频| 老司机精品久久| 亚洲手机视频| 麻豆精品久久久| 日韩理论片av| 玖玖精品视频| 国产成人久久精品一区二区三区| 国产欧美日韩在线一区二区| 国产一卡不卡| 欧美日韩国产免费观看视频| 精品一区欧美| 九色porny丨国产首页在线| 日本在线观看不卡视频| 日韩激情综合| 美女免费视频一区| 日韩高清二区| 国产成人精品999在线观看| 日韩精品久久理论片| 国产乱人伦丫前精品视频| 日本欧美不卡| 丝袜国产日韩另类美女| 国产欧美精品久久| 国产精品人人爽人人做我的可爱| 亚洲综合不卡| 国产精品一区二区三区av| 久久99国产精品视频| 国产亚洲精品精品国产亚洲综合| 黄色欧美在线| 美日韩一区二区三区| 蜜臀久久99精品久久久久宅男| 色黄视频在线观看| 精品日韩一区| 美女网站视频一区| 蜜桃传媒麻豆第一区在线观看| 亚洲人成亚洲精品| 国产亚洲第一伦理第一区| 超级白嫩亚洲国产第一| 日本色综合中文字幕| 国产高清视频一区二区| 欧美日韩在线播放视频| 中文在线不卡| 国产精品99一区二区三| 亚洲涩涩在线| 精品欧美一区二区三区在线观看| 日韩欧美中文字幕一区二区三区| 久久国产精品色av免费看| 精品国产美女a久久9999| 9色精品在线| 国产免费av国片精品草莓男男| 美女精品网站| 亚洲手机在线| 国产在线观看www| 亚洲涩涩av| 久久一二三区| 噜噜噜久久亚洲精品国产品小说| 日韩成人三级| 日韩不卡手机在线v区| 亚洲专区视频| 亚洲天堂资源| 亚洲美女久久精品| 麻豆久久一区| 久久精品一区二区国产| 99久久九九| 亚洲欧美一区在线| 欧美一区=区三区| 麻豆精品视频在线观看免费| 性色一区二区| 夜鲁夜鲁夜鲁视频在线播放| 日韩国产欧美| 国产欧美亚洲一区| 色8久久久久| 神马午夜在线视频| 在线精品国产亚洲| 黄色亚洲免费| 性欧美xxxx免费岛国不卡电影| 欧美精品aa| 欧美日韩午夜| 日韩精品1区2区3区| 在线精品一区| 丝袜国产日韩另类美女| 1024精品一区二区三区| 日韩伦理一区| 高清精品久久| 精品亚洲自拍| 成人精品视频| 麻豆精品蜜桃| 99热精品在线|