电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Android中的緩存

瀏覽:4日期: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
相關文章:
主站蜘蛛池模板: 蚂蚁分类信息系统 - PHP同城分类信息系统 - MayiCMS | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 挨踢网-大家的导航! | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 昊宇水工|河北昊宇水工机械工程有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | 山东包装,山东印刷厂,济南印刷厂-济南富丽彩印刷有限公司 | 不发火防静电金属骨料_无机磨石_水泥自流平_修补砂浆厂家「圣威特」 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 百度关键词优化_网站优化_SEO价格 - 云无限好排名 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 浙江上沪阀门有限公司| B2B网站_B2B免费发布信息网站_B2B企业贸易平台 - 企资网 | 挤塑板-XPS挤塑板-挤塑板设备厂家[襄阳欧格] | 在线悬浮物浓度计-多参数水质在线检测仪-上海沃懋仪表科技有限公司 | 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 合肥弱电工程_安徽安防工程_智能化工程公司-合肥雷润 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 钢托盘,钢制托盘,立库钢托盘,金属托盘制造商_南京飞天金属制品实业有限公司 | 纯化水设备-EDI-制药-实验室-二级反渗透-高纯水|超纯水设备 | 武汉创亿电气设备有限公司_电力检测设备生产厂家 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 高速龙门架厂家_监控杆_多功能灯杆_信号灯杆_锂电池太阳能路灯-鑫世源照明 | 黄石妇科医院_黄石东方女子医院_黄石东方妇产医院怎么样 | 电动垃圾车,垃圾清运车-江苏速利达机车有限公司 | 陕西华春网络科技股份有限公司| 门禁卡_智能IC卡_滴胶卡制作_硅胶腕带-卡立方rfid定制厂家 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 宁夏档案密集柜,智能密集柜,电动手摇密集柜-盛隆柜业宁夏档案密集柜厂家 | 复盛空压机配件-空气压缩机-复盛空压机(华北)总代理 | 滚筒线,链板线,总装线,流水线-上海体能机电有限公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 |