版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android-Universal-Image-Loader目標(biāo)2一、概述2介紹2功能介紹:31.3 能加載的類(lèi)型:3二、使用使用流程:4錯(cuò)位問(wèn)題:4自定義顯示效果:52.4 顯示樣式 displayer 說(shuō)明:52.4加載:5三、自己實(shí)現(xiàn)ImageLoader63.1 代碼實(shí)現(xiàn):6四、源碼分析114.1 工程結(jié)構(gòu)114.2 架構(gòu)圖:134.3加載流程134.4 DisplayImage()函數(shù)流程:154.5 代碼: . 154.6 Task 專(zhuān)題:19五、其他細(xì)節(jié):205.1 UIL 默認(rèn)磁盤(pán)緩存目錄5.5緩存目錄以及文件名:20: . 21內(nèi)存緩
2、存策略:23磁盤(pán)緩存策略:255.6 journal 文件說(shuō)明26六、常見(jiàn)面試題28七、總結(jié)297.1.使用流程2.加載流程29細(xì)節(jié)291目標(biāo)UIL 的用途UIL 的使用方法以及項(xiàng)目集成加載流程UIL代碼原理一、概述1.1 介紹加載庫(kù) Android-Universal-Image-Loader 以下簡(jiǎn)稱(chēng)UIL。項(xiàng)目地址:/nostra13/Android-Universal-Image-LoaderAndroid Universal Image Loader 是一個(gè)強(qiáng)大的、可高度定制的加載庫(kù),以下簡(jiǎn)稱(chēng)為UIL。簡(jiǎn)單的說(shuō)UIL 就做了一件事:獲取并顯示在相應(yīng)的 ImageVie
3、w 控件上。:21.2 功能介紹:多線(xiàn)程加載(同步、異步)定制加載配置項(xiàng)(線(xiàn)程池、器、器、內(nèi)存緩存、磁盤(pán)緩存、顯示)1.3 能加載的類(lèi)型:1. /image.png / 網(wǎng)絡(luò)加載2. file:/mnt/sdcard/image.png / 加載 SD 卡文件3. file:/mnt/sdcard/.mp4 / 加載 SD 卡里的預(yù)覽圖4. content:/media/external/images/media/13 / 加載 content provider 的5. content:/media/external/media/13 / content provider 里的預(yù)覽圖6. as
4、sets:/image.png / 加載 assets 里的資源7. drawable:/ + R.drawable.img / 加載本地 drawables 資源(非.9)3二、使用2.1 使用流程:1.文件里 添限2. 初始化 ImageLoader一般建議是在Application 里做初始化操作,也可以在 Activity 里初始化3.加載2.2錯(cuò)位問(wèn)題:加上顯示設(shè)置參數(shù),即加載時(shí)顯示占位圖即可。4/顯示設(shè)置options = new DisplayImageOptions.Builder()/displayImage(String uri對(duì)應(yīng)的 url 地址, ImageView i
5、mageView 需要展示的 ImageView) ImageLoader.getInstance().displayImage(url, imageView);/初始化配置參數(shù)ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(this); config.threriority(Thread.NORM_PRIORITY - 2);/優(yōu)先級(jí) config.denyCacheImageMultipleSizesemory();/在內(nèi)存里緩存多種分辨率的 config.diskCacheFil
6、eNameGenerator(new Md5FileNameGenerator();/磁盤(pán)緩存是的文件名 config.diskCacheSize(50 * 1024 * 1024); / 50 MiB 磁盤(pán)緩存大小config.tasksProsingOrder(QueueProsingType.LIFO);/任務(wù)處理順序 config.writeDebugLogs(); / Remove for release app /輸出日志/初始化 ImageLoader ImageLoader.getInstance().init(config.build();展示2.3自定義顯示效果:2.4 顯
7、示樣式 displayer 說(shuō)明:2.4加載:實(shí)現(xiàn)顯示效果,例如圓角+漸變5/加載器private sic class AnimateDisplayListener extends SimpleImageLoadingListener sic final List displayedImages = Collections.synchronizedList(newLinkedList();.displayer(new CircitmapDisplayer(Color.WHITE, 5)/顯示樣式-圓形.displayer(new FadeInBitmapDisplayer(200)/顯示樣式-
8、漸進(jìn).displayer(new RoundedBitmapDisplayer(8)/顯示樣式-圓角options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.ic_stub) /加載時(shí)顯示的占位圖.showImageForEmptyUri(R.drawable.ic_empty)/空 url 地址時(shí)顯示的.showImageOnFail(R.drawable.ic_error)/加載失敗時(shí)顯示的.cacheemory(true)/緩存到內(nèi)存,默認(rèn)為 false.cacheOnDisk(true)/緩存到磁
9、盤(pán),默認(rèn)為 false/.displayer(new CircitmapDisplayer(Color.WHITE, 5)/顯示樣式-圓形/.displayer(new FadeInBitmapDisplayer(200)/顯示樣式-漸進(jìn).displayer(new RoundedBitmapDisplayer(8)/顯示樣式-圓角,默認(rèn)為 SimpitmapDisplayer.considerExifParams(true)/是否考慮加載 exif(數(shù)碼相機(jī)格式),默認(rèn)值為 false.bitmapConfig(Bitmap.Config.ARGB_8888)/位圖顯示質(zhì)量,默認(rèn)值為 ARG
10、B_8888/.resetViewBeforeLoading(true)/默認(rèn)為 false,加載前執(zhí)行 imageAware.setImageDrawable(null);.build();ImageLoader.getInstance().displayImage(url, holder.image, options);.showImageOnLoading(R.drawable.ic_stub) /加載時(shí)顯示的占位圖.build();三、自己實(shí)現(xiàn) ImageLoader3.1 代碼實(shí)現(xiàn):6/*Description: 封裝簡(jiǎn)陋的加載器只是一個(gè)簡(jiǎn)單地示例,很多細(xì)節(jié)沒(méi)處理,例如 task 的
11、等待隊(duì)列與任務(wù)取消,緩存大小超過(guò)限制時(shí)的邏輯,例如 LRU策略等。*author程序員 http/* date 2016-4-2 上午 12:06:54*/public class ImageLoader private sic final String TAG = ImageLoader;private sic ImageLoader mInstance = new ImageLoader();/內(nèi)存緩存public sic Map mCache = new HashMap();/線(xiàn)程池private sic Executor mPool;/構(gòu)造函數(shù)設(shè)置為私有,外部實(shí)例化Overridepu
12、blic voidplete(String imageUri, View view, Bitmap loadedImage) /加載完成if (loadedImage != null) ImageView imageView = (ImageView) view;Display = !displayedImages.contains(imageUri);/只在第一次執(zhí)行漸進(jìn)動(dòng)畫(huà) if (Display) FadeInBitmapDisplayer.animate(imageView, 500); displayedImages.add(imageUri);/單例模式public sic Ima
13、geLoader getInstance()mPool = Executors.newFixedThrereturn mInstance;ool(5);/*顯示param url的 url 地址param imageview 需要展示*/的 imageview 控件public void displayImage(String url, ImageView imageview)LoadImageTask task = new LoadImageTask(url, imageview);/task.execute(); /單線(xiàn)程模式 task.executeOnExecutor(mPool);/
14、多線(xiàn)程模式/加載任務(wù)private class LoadImageTask extends Asyn private String mUrl;private ImageView mImageview;kpublic LoadImageTask(String url, ImageView imageView)mUrl = url;mImageview = imageView;Overrideprotected void onPreExecute() Log.d(TAG, onPreExecute(); super.onPreExecute();/加載之前設(shè)置占位圖(預(yù)覽圖)mImageview.
15、setImageResource(R.drawable.ic_stub);Overrideprotected Bitmap Log.d(TAG, nBackground(Void. params) nBackground(), url: + mUrl);/1.從內(nèi)存緩存里獲取 bitmap7private ImageLoader()Bitmap bitmap = mCache.get(mUrl);if (bitmap != null) Log.d(TAG, 內(nèi)存緩存里存在 bitmap); return bitmap;/2.從磁盤(pán)緩存里獲取 bitmapFile file = getFile(
16、mUrl);/獲取 url 對(duì)應(yīng)的文件if (file.exists() Log.d(TAG, 磁盤(pán)緩存里有文件,直接該文件);/從磁盤(pán)緩存里位圖,并緩存到內(nèi)存緩存里bitmap = decodeFile(file);return bitmap;/3.從網(wǎng)絡(luò)上加載Log.d(TAG, 沒(méi)有緩存,從網(wǎng)絡(luò)加載); try URL url = new URL(mUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();/設(shè)置超時(shí)時(shí)間比較短利于測(cè)試,實(shí)際開(kāi)發(fā)中使用默認(rèn)時(shí)間即可 conn.setConnectTimeou
17、t(5000);conn.setReadTimeout(5000);code = conn.getResponseCode();if (code = 200) Log.d(TAG, 獲取流: + mUrl); InputStream in = conn.getInputStream();/緩存到 SD 卡file = getFile(mUrl);FileOutputStream out = new FileOutputStream(file); writeStream(in, out);/從磁盤(pán)緩存里位圖,并緩存到內(nèi)存緩存里bitmap = decodeFile(file);return bi
18、tmap; catch (Exception e) e.prStackTrace();8/從磁盤(pán)緩存里位圖,并緩存到內(nèi)存緩存里private Bitmap decodeFile(File file) : + mUrl);Log.d(TAG, Options opts = new Options();leSize = 4;/采樣大小為縮放原來(lái)的 1/4,實(shí)際開(kāi)發(fā)中需要?jiǎng)討B(tài)計(jì)算opts.inS/error 級(jí)別的錯(cuò)誤,try catch 沒(méi)用,照樣Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), opts);/緩存到內(nèi)存 mCache
19、.put(mUrl, bitmap);Log.d(TAG, 緩存 bitmap 到內(nèi)存緩存,當(dāng)前 size =+ mCache.size();return bitmap;Overrideprotected void ontExecute(Bitmap bmp) super.ontExecute(bmp);/展示if (bmp != null) mImageview.setImageBitmap(bmp);else/顯示錯(cuò)誤 mImageview.setImageResource(R.drawable.ic_error);/保存private void writeStream(InputStre
20、am in, OutputStream out) byte buffer = new byte1024;len = -1;try while (len = in.read(buffer) != -1) out.write(buffer, 0, len); catch (Exception e) e.prStackTrace();finallyif (in != null) try 9return null;in.close(); catch (IOException e) e.prStackTrace();if (out != null) try in.close(); catch (IOEx
21、ception e) e.prStackTrace();/獲取 url 對(duì)應(yīng)的文件private File getFile(String url) /獲取 SD 卡根目錄File rootPath = Environment.getExternalStorageDirectory();/創(chuàng)建文件保存目錄File imagePath = new File(rootPath, heima); if (!imagePath.exists() imagePath.mkdirs();/生成文件名String fileName = generateFileName(url);/創(chuàng)建文件,擴(kuò)展名不建議以.j
22、pg 之類(lèi)的格式結(jié)尾,避免用戶(hù)在相冊(cè)里看到緩存的Log.d(TAG, fileName: + fileName);File file = new File(imagePath, fileName + .data); return file;/生成文件名public String generateFileName(String url) try /對(duì) url 進(jìn)行 md5 編碼MessageDigest md5 = MessageDigest.getInstance(MD5); byte digest = md5.digest(url.getBytes();/字節(jié)數(shù)組轉(zhuǎn)換成大數(shù)字Bigeger
23、i= new Bigeger(digest).abs();/轉(zhuǎn)換成 16 進(jìn)制字符串10、源碼分析4.1 工程結(jié)構(gòu)1.模塊:11四 catch (NoSuchAlgorithmException e) e.prStackTrace();return null;String result = i.toString(16); return result;2.緩存模塊:3.工具類(lèi)模塊:124.2 架構(gòu)圖:4.3加載流程英文:13中文:144.4 DisplayImage()函數(shù)流程:4.5 代碼:1.代碼2.會(huì)將 imageview成 ImageViewAware153.ImageViewAware
24、 的作用:4.將 view 轉(zhuǎn)換為弱(默認(rèn)情況下是強(qiáng))擴(kuò)展閱讀:Java:對(duì)象的強(qiáng)、軟、弱和虛/113473/53092/5.在 displayImage 方法里,先從內(nèi)存緩存里取6.如果內(nèi)存緩存沒(méi)有,則開(kāi)啟一個(gè) task 從磁盤(pán)緩存里取7.在 LoadAndDisplayImageTask 的 run 方法里嘗試從磁盤(pán)里加載8.在 tryLoadBitmap 方法里先獲取文件,然后進(jìn)行操作,否則執(zhí)行 tryCacheImageOnDisk 方法從網(wǎng)絡(luò)加載。16bmp = tryLoadBitmap();LoadAndDisplayImageTask displayTask = new Loa
25、dAndDisplayImageTask(engine, imageLoadingInfo, defineHandler(options);Bitmap bmp = configuration.memoryCache.get(memoryCacheKey);9.tryCacheImageOnDisk 方法里跳轉(zhuǎn)了很多方法,其為使用 HttpUrlConnection 請(qǐng)求網(wǎng)絡(luò)獲取流10.得到流后最終保存到磁盤(pán)緩存里11.tryCacheImageOnDisk 方法執(zhí)行完畢后,則對(duì)應(yīng)的已經(jīng)完畢,并且保存到磁盤(pán)里了,在下面的 decodeImage 方法里進(jìn)行即到 bitmap 對(duì)象。1712.最
26、終,后得到的 bitmap 緩存到內(nèi)存里13.得到 bitmap 后需要交給 displayer 顯示,具體顯示成什么效果,有用戶(hù)設(shè)置的 displayer 決定,例如圓形、漸進(jìn)、圓角等。18DisplayBitmapTask displayBitmapTask = new DisplayBitmapTask(bmp, imageLoadingInfo, engine, loadedFrom);runTask(displayBitmapTask, syncLoading, handler, engine);4.6 Task 專(zhuān)題:在加載流程里的步驟 6 里,如果內(nèi)存緩存沒(méi)有,則開(kāi)啟一個(gè) tas
27、k 從磁盤(pán)緩存里取每個(gè)Task 就是一個(gè)實(shí)現(xiàn)了Runnable 接口的類(lèi)該 task 會(huì)可同步執(zhí)行或異步執(zhí)行異步執(zhí)行的是將其交給 Executor 執(zhí)行Executor 的默認(rèn)實(shí)現(xiàn)為一個(gè)阻塞隊(duì)列(初始化線(xiàn)程池大小為 3,優(yōu)先級(jí)為 Thread.NORM_PRIORITY - 2)19LoadAndDisplayImageTask displayTask = new LoadAndDisplayImageTask(engine, imageLoadingInfo, defineHandler(options);五、其他細(xì)節(jié):5.1 UIL 默認(rèn)磁盤(pán)緩存目錄5.2 緩存目錄以及文件名:mnt/sd
28、card/Android/data/包名目錄下的文件,當(dāng) apk 被卸載時(shí)會(huì)自動(dòng)被刪除,避免留存文件名自定義的好處是,可以避免文件名過(guò)長(zhǎng),避免特殊字符2.修改擴(kuò)展名的好處是,如果緩存的以 jpg 等擴(kuò)展名結(jié)尾,則用戶(hù)相冊(cè)里會(huì)看到,干擾用戶(hù)看圖。這樣用戶(hù)查看相冊(cè)時(shí),不會(huì)看到緩存的而手寫(xiě)的 demo 沒(méi)修改擴(kuò)展名,會(huì)在相冊(cè)里展示,影響用戶(hù)體驗(yàn),如下圖:205.3:是非常的操作,很容易造成內(nèi)存溢出錯(cuò)誤,而且這個(gè)不是普通的異常,而是致命的錯(cuò)誤級(jí)別。所以 try catch 是沒(méi)用的,照樣。Bitmap bitmap = BitmapFactory.decodeStream();后占用內(nèi)存大小計(jì)算公式:
29、一張(Bitmap)占用的內(nèi)存=長(zhǎng)度*寬度*像素占用的字節(jié)數(shù)(質(zhì)量)質(zhì)量說(shuō)明:21Bitmap.ConfigALPHA_8Each pixel is stored as a single translucency (alpha) channel.This is very useful to efficiently store masks for instance. No color information is stored. With this configuration, each pixel requires 1 byte of memory.此時(shí)只有 alpha 值,沒(méi)有 RGB 值,
30、一個(gè)像素占用一個(gè)字節(jié)Bitmap.ConfigARGB 44This field is deprecated. Because of the poor quality of this configuration, it is44advised to use ARGB 8888instead.這種格式的,看起來(lái)質(zhì)量太差,已經(jīng)不使用。Each pixel is stored on 2 bytes. The three RGB color channels and the alpha channel(translucency) are stored wi4 bits preci(16sible va
31、lues.) This configuration is mostly useful if the application needs to store translucency information but also needs to save memory. It ismended to use ARGB 8888 configuration.一個(gè)像素占用 2 個(gè)字節(jié),alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占 4 個(gè)bites,共 16bites,即 2 個(gè)字節(jié)Bitmap.ConfigARGB 88Each pixel is stored on 4
32、bytes. Each channel (RGB and alpha for translucency) is88stored with 8 bits of preci(256sible values.) This configuration is very flexible and offers the best quality. It should be used whenevossible一個(gè)像素占用 4 個(gè)字節(jié),alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占 8 個(gè)bites,共 32bites,即 4 個(gè)字節(jié),這是一種高質(zhì)量的格式,電腦上普通采用的格式。
33、它也是Android上一個(gè) BitMap 的默認(rèn)格式。例如一張 512x512 的需要申請(qǐng)開(kāi)辟的內(nèi)存為 1M 左右(512 * 512 * 4 = 1048576 字節(jié)1048576 / (1024 * 1024) = 1M顯示質(zhì)量為 ARGB_8888),即原因:每一臺(tái)設(shè)備的 app 能使用的內(nèi)存大小是不一樣的,有些可以使用 16M,有些可以使用 32M,當(dāng)一張寬高大于 512x512 的的時(shí)候,很容易造成內(nèi)存溢出,導(dǎo)致,但是一張大圖需要開(kāi)辟的內(nèi)存空間一般 2M 左右,為什么也會(huì)呢,原因是 android 在位圖的時(shí)候,內(nèi)存會(huì)變得非常敏感,就算 app一張需要開(kāi)辟的空間比較大,例如大于 2M
34、,則會(huì)拋出異總共可以使用的內(nèi)存常。下很多,只要解決方法:一張雖然很大,例如 1024x1024,但是需要展示他的 ImageView 控件通常大小都很小,例如 64x64,根本不需要成這么大的,所以采樣的時(shí)候,只需對(duì)進(jìn)行縮放采樣即可。例如只申請(qǐng)開(kāi)辟64x64 大小對(duì)應(yīng)的內(nèi)存空間,用來(lái)保存縮放并后的。時(shí)設(shè)置采樣縮放比例當(dāng)然實(shí)際開(kāi)發(fā)中這個(gè)縮放比例不是寫(xiě)死的,而是動(dòng)態(tài)計(jì)算出來(lái)的。例如原始大小為 1024*768,而實(shí)際 ImageView 的寬高是 64*64,則縮放比例為 1024/64=1622Options opts = new Options();opts.inSleSize = 4;/采樣
35、大小為縮放原來(lái)的 1/4,實(shí)際項(xiàng)目中不會(huì)直接寫(xiě)死,而是動(dòng)態(tài)計(jì)算。/error 級(jí)別的錯(cuò)誤,try catch 沒(méi)用,照樣bitmap = BitmapFactory.decodeStream(in, null, opts);Bitmap.ConfigRGB_565Each pixel is stored on 2 bytes and only the RGB channels are encoded: red is stored with 5 bits of preci(32sible values), green is stored with 6 bits of preci(64sible
36、values) and blue is stored with 5 bits of preci. This configuration can produlight visual artifacts depending on the configuration of the source. For instance, without dithering, the result might show a greenish t. To get better results dithering should be appd. This configuration may be useful when
37、 using opaque bitmapst do not require high color fidelity.一個(gè)像素占用 2 個(gè)字節(jié),沒(méi)有alpha(A)值,即不支持透明和半透明,Red(R)值占 5 個(gè)bites ,Green(G)值占 6 個(gè) bites ,Blue(B)值占 5 個(gè) bites,共 16bites,即 2 個(gè)字節(jié).對(duì)于沒(méi)有透明和半透明顏色的來(lái)說(shuō),該格式的能夠達(dá)到比較的呈現(xiàn)效果,相對(duì)于 ARGB_8888 來(lái)說(shuō)也能減少一半的內(nèi)存開(kāi)銷(xiāo)。因此它是一個(gè)不錯(cuò)的選擇。另外通過(guò) android.content.res.Resour來(lái)取得一個(gè)張時(shí),它也是以該格式來(lái)構(gòu)建 BitMa
38、p 的從 Android4.0 開(kāi)始,該選項(xiàng)無(wú)效。即使設(shè)置為該值,系統(tǒng)任然會(huì)采用 ARGB_8888 來(lái)5.4 內(nèi)存緩存策略:默認(rèn)使用 LruMemoryCache 緩存策略,緩存大小為內(nèi)存等級(jí)的 1/8每部的單個(gè) app 能使用的內(nèi)存大小都是固定的,例如 16M、32M 等,可以調(diào)用系統(tǒng) api 獲取這個(gè)值。am.getMemoryClass();23/原始,即網(wǎng)絡(luò)上的,例如 1024x768 finalsrcWidth = srcSize.getWidth(); finalsrcHeight = srcSize.getHeight();/目標(biāo)顯示,即 ImageView 的大小,例如 64
39、x64finalWidth = maxBitmapSize.getWidth();finalHeight = maxBitmapSize.getHeight();/計(jì)算縮放比例finalwidthScale = () Math.ceil(float) srcWidth /Width); finalheightScale = () Math.ceil(float) srcHeight /Height);/取大的值,例如 1204/64=16,768/64=12,最終使用的縮放比例是 16 return Math.max(widthScale, heightScale); / max/計(jì)算最小縮放
40、尺寸public siccomputeMinImageSleSize(ImageSize srcSize) LruMemoryCache實(shí)現(xiàn)每次調(diào)用 put 方法緩存時(shí),會(huì)將新的 bitmap鏈表尾部,同時(shí)計(jì)算緩存大小是否已經(jīng)超過(guò)限制,如果超過(guò)則移除最頭部的節(jié)點(diǎn)值(即移除最少使用的)移除操作245.5磁盤(pán)緩存策略:如果用戶(hù)設(shè)置磁盤(pán)緩存大小,則使用 LruDiskCache,否則使用不限制大小的 UnlimitedDiskCache磁盤(pán)緩存機(jī)制每次做磁盤(pán)緩存操作的時(shí)候,journal 文件里。從 cache(即 LruDiskCache)里獲取編輯器 editor,將相關(guān)信息寫(xiě)到cache.ed
41、it 方法實(shí)現(xiàn)255.6 journal 文件說(shuō)明磁盤(pán)緩存日志文件 journal 路徑:journal 文件格式26:第 1 行是個(gè)固定的字符串“l(fā)ibcore.io.DiskLruCache”,表示使用的是 DiskLruCache 技術(shù)。第 2 行是DiskLruCache 的版本號(hào),這個(gè)值目前固定為 1。第 3 行是應(yīng)用程序的版本號(hào),在 open()方法中傳入,一旦應(yīng)用的版本號(hào)升級(jí),journal 文件就會(huì)掉所有數(shù)據(jù)重新統(tǒng)計(jì)。第 4 行是 valueCount,這個(gè)值也是在 open()方法中傳入的,通常情況下都為 1。第 5 行是一個(gè)空行。前 5 行稱(chēng)為 journal 文件的文件頭
42、。第 6 行是以一個(gè) DIRTY 前綴開(kāi)始的,后面緊跟著緩存的 key。這意味著這是一條臟數(shù)據(jù)。每當(dāng)調(diào)用一次 DiskLruCache 的 edit()方法時(shí),都會(huì)向 journal 文件中寫(xiě)入一條 DIRTY,表示正準(zhǔn)備寫(xiě)入一條緩存數(shù)據(jù),但不知結(jié)果如何。然后調(diào)用 commit()方法表示寫(xiě)入緩存成功,這時(shí)會(huì)向 journal 中寫(xiě)入一條CLEAN,意味著這條“臟”數(shù)據(jù)被“洗干凈了”,調(diào)用 abort()方法表示寫(xiě)入緩存失敗,這時(shí)會(huì)向 journal中寫(xiě)入一條 REMOVE。也就是說(shuō),每一行 DIRTY 的 key,后面都應(yīng)該有一行對(duì)應(yīng)的CLEAN 或者REMOVE 的,否則這條數(shù)據(jù)就是“臟”
43、的,會(huì)被自動(dòng)刪除掉。27/構(gòu)造方法public sic DiskLruCache open(File directory,appVer,valueCount, long maxSize, maxFileCount)后面的數(shù)據(jù),除了CLEAN 前綴和 key 之外,尾部還會(huì)有一串?dāng)?shù)字,例如 437346,這表示該文件的大小,DiskLruCache 會(huì)在每一行 CLEAN的最后加上該條緩存數(shù)據(jù)的大小,以字節(jié)為。DiskLruCache 的size()方法可以獲取到當(dāng)前緩存路徑下所有緩存數(shù)據(jù)的總字節(jié)數(shù),工作原理是把journal文件中所有 CLEAN的字節(jié)數(shù)相加,求出的總合再把它返回。除了DIRTY、CLEAN、REMOVE 之外,還有一種前綴是 READ 的,這個(gè)表示每當(dāng)調(diào)用 get()方法去一條緩存數(shù)據(jù)時(shí),就
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 約版入職合同范本
- 南京市2024江蘇南京審計(jì)大學(xué)教學(xué)科研崗招聘88人筆試歷年參考題庫(kù)典型考點(diǎn)附帶答案詳解(3卷合一)
- 法律顧問(wèn)面試技巧與答案
- 起重機(jī)械管理員安全生產(chǎn)考核辦法含答案
- 計(jì)算機(jī)系統(tǒng)分析師面試考點(diǎn)預(yù)測(cè)
- 健康管理師面試題詳解與準(zhǔn)備技巧
- 2025年在線(xiàn)家庭教育平臺(tái)建設(shè)可行性研究報(bào)告
- 2025年區(qū)塊鏈金融服務(wù)平臺(tái)建立可行性研究報(bào)告
- 2025年數(shù)據(jù)隱私保護(hù)項(xiàng)目可行性研究報(bào)告
- 2025年舊貨市場(chǎng)再生經(jīng)濟(jì)可行性研究報(bào)告
- 開(kāi)放系統(tǒng)10862人文英語(yǔ)(4)期末機(jī)考真題及答案
- GB/T 4957-2003非磁性基體金屬上非導(dǎo)電覆蓋層覆蓋層厚度測(cè)量渦流法
- GB/T 27806-2011環(huán)氧瀝青防腐涂料
- GB/T 12618.1-2006開(kāi)口型平圓頭抽芯鉚釘10、11級(jí)
- FZ/T 52051-2018低熔點(diǎn)聚酯(LMPET)/聚酯(PET)復(fù)合短纖維
- 設(shè)備吊裝方案編制受力計(jì)算
- 食品工程原理概述經(jīng)典課件
- 養(yǎng)老院機(jī)構(gòu)組織架構(gòu)圖
- 財(cái)經(jīng)法規(guī)與會(huì)計(jì)職業(yè)道德
- 會(huì)計(jì)學(xué)本-財(cái)務(wù)報(bào)表分析綜合練習(xí)
- 《中國(guó)傳統(tǒng)文化心理學(xué)》課件第五章 傳統(tǒng)文化與心理治療(修)
評(píng)論
0/150
提交評(píng)論