Skip to content

Commit bf79f2a

Browse files
committed
New Disc cache API
1 parent d418485 commit bf79f2a

13 files changed

+1498
-109
lines changed

library/src/com/nostra13/universalimageloader/cache/disc/BaseDiscCache.java

+52-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
*******************************************************************************/
1616
package com.nostra13.universalimageloader.cache.disc;
1717

18+
import android.graphics.Bitmap;
1819
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
1920
import com.nostra13.universalimageloader.core.DefaultConfigurationFactory;
21+
import com.nostra13.universalimageloader.utils.IoUtils;
2022

21-
import java.io.File;
23+
import java.io.*;
2224

2325
/**
2426
* Base disc cache. Implements common functionality for disc cache.
@@ -30,6 +32,7 @@
3032
*/
3133
public abstract class BaseDiscCache implements DiscCacheAware {
3234

35+
private static final int BUFFER_SIZE = 32 * 1024; // 32 Kb
3336
private static final String ERROR_ARG_NULL = "\"%s\" argument must be not null";
3437

3538
protected File cacheDir;
@@ -53,9 +56,49 @@ public BaseDiscCache(File cacheDir, FileNameGenerator fileNameGenerator) {
5356
}
5457

5558
@Override
56-
public File get(String key) {
57-
String fileName = fileNameGenerator.generate(key);
58-
return new File(cacheDir, fileName);
59+
public File getDirectory() {
60+
return cacheDir;
61+
}
62+
63+
@Override
64+
public File get(String imageUri) {
65+
File file = getFile(imageUri); // TODO : Maybe check root dir if it not available. Think about reserve cache dir
66+
return file.exists() ? file : null;
67+
}
68+
69+
@Override
70+
public boolean save(String imageUri, InputStream imageStream) throws IOException {
71+
File imageFile = getFile(imageUri);
72+
try {
73+
OutputStream os = new BufferedOutputStream(new FileOutputStream(imageFile), BUFFER_SIZE);
74+
try {
75+
IoUtils.copyStream(imageStream, os, BUFFER_SIZE);
76+
} finally {
77+
IoUtils.closeSilently(os);
78+
}
79+
} finally {
80+
IoUtils.closeSilently(imageStream);
81+
}
82+
return true;
83+
}
84+
85+
@Override
86+
public boolean save(String imageUri, Bitmap bitmap, Bitmap.CompressFormat format, int quality) throws IOException {
87+
File imageFile = getFile(imageUri);
88+
OutputStream os = new BufferedOutputStream(new FileOutputStream(imageFile), BUFFER_SIZE);
89+
boolean savedSuccessfully;
90+
try {
91+
savedSuccessfully = bitmap.compress(format, quality, os);
92+
} finally {
93+
IoUtils.closeSilently(os);
94+
}
95+
bitmap.recycle();
96+
return savedSuccessfully;
97+
}
98+
99+
@Override
100+
public boolean remove(String imageUri) {
101+
return getFile(imageUri).delete();
59102
}
60103

61104
@Override
@@ -67,4 +110,9 @@ public void clear() {
67110
}
68111
}
69112
}
113+
114+
protected File getFile(String imageUri) {
115+
String fileName = fileNameGenerator.generate(imageUri);
116+
return new File(cacheDir, fileName);
117+
}
70118
}

library/src/com/nostra13/universalimageloader/cache/disc/DiscCacheAware.java

+15-15
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@
1515
*******************************************************************************/
1616
package com.nostra13.universalimageloader.cache.disc;
1717

18+
import android.graphics.Bitmap;
19+
1820
import java.io.File;
21+
import java.io.IOException;
22+
import java.io.InputStream;
1923

2024
/**
2125
* Interface for disc cache
@@ -24,20 +28,16 @@
2428
* @since 1.0.0
2529
*/
2630
public interface DiscCacheAware {
27-
/**
28-
* This method must not to save file on file system in fact. It is called after image was cached in cache directory
29-
* and it was decoded to bitmap in memory. Such order is required to prevent possible deletion of file after it was
30-
* cached on disc and before it was tried to decode to bitmap.
31-
*/
32-
void put(String key, File file);
33-
34-
/**
35-
* Returns {@linkplain File file object} appropriate incoming key.<br />
36-
* <b>NOTE:</b> Must <b>not to return</b> a null. Method must return specific {@linkplain File file object} for
37-
* incoming key whether file exists or not.
38-
*/
39-
File get(String key);
40-
41-
/** Clears cache directory */
31+
32+
File getDirectory();
33+
34+
File get(String imageUri);
35+
36+
boolean save(String imageUri, InputStream imageStream) throws IOException;
37+
38+
boolean save(String imageUri, Bitmap bitmap, Bitmap.CompressFormat format, int quality) throws IOException;
39+
40+
boolean remove(String imageUri);
41+
4242
void clear();
4343
}

library/src/com/nostra13/universalimageloader/cache/disc/LimitedDiscCache.java

+56-17
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
*******************************************************************************/
1616
package com.nostra13.universalimageloader.cache.disc;
1717

18+
import android.graphics.Bitmap;
1819
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
1920
import com.nostra13.universalimageloader.core.DefaultConfigurationFactory;
2021

2122
import java.io.File;
23+
import java.io.IOException;
24+
import java.io.InputStream;
2225
import java.util.Collections;
2326
import java.util.HashMap;
2427
import java.util.Map;
@@ -87,31 +90,48 @@ public void run() {
8790
}
8891

8992
@Override
90-
public void put(String key, File file) {
91-
int valueSize = getSize(file);
92-
int curCacheSize = cacheSize.get();
93+
public File get(String key) {
94+
File file = super.get(key);
9395

94-
while (curCacheSize + valueSize > sizeLimit) {
95-
int freedSize = removeNext();
96-
if (freedSize == INVALID_SIZE) break; // cache is empty (have nothing to delete)
97-
curCacheSize = cacheSize.addAndGet(-freedSize);
96+
if (file != null && file.exists()) {
97+
Long currentTime = System.currentTimeMillis();
98+
file.setLastModified(currentTime);
99+
lastUsageDates.put(file, currentTime);
98100
}
99-
cacheSize.addAndGet(valueSize);
100101

101-
Long currentTime = System.currentTimeMillis();
102-
file.setLastModified(currentTime);
103-
lastUsageDates.put(file, currentTime);
102+
return file;
104103
}
105104

106105
@Override
107-
public File get(String key) {
108-
File file = super.get(key);
106+
public boolean save(String uri, InputStream imageStream) throws IOException {
107+
boolean saved = super.save(uri, imageStream);
108+
if (saved) {
109+
rememberUsage(uri);
110+
trimCacheSize();
111+
}
112+
return saved;
113+
}
109114

110-
Long currentTime = System.currentTimeMillis();
111-
file.setLastModified(currentTime);
112-
lastUsageDates.put(file, currentTime);
115+
@Override
116+
public boolean save(String uri, Bitmap bitmap, Bitmap.CompressFormat format, int quality) throws IOException {
117+
boolean saved = super.save(uri, bitmap, format, quality);
118+
if (saved) {
119+
rememberUsage(uri);
120+
trimCacheSize();
121+
}
122+
return saved;
123+
}
113124

114-
return file;
125+
@Override
126+
public boolean remove(String uri) {
127+
File file = getFile(uri);
128+
int valueSize = getSize(file);
129+
boolean removed = super.remove(uri);
130+
if (removed) {
131+
cacheSize.addAndGet(-valueSize);
132+
lastUsageDates.remove(uri);
133+
}
134+
return removed;
115135
}
116136

117137
@Override
@@ -121,6 +141,25 @@ public void clear() {
121141
super.clear();
122142
}
123143

144+
private void rememberUsage(String uri) {
145+
File file = getFile(uri);
146+
int valueSize = getSize(file);
147+
148+
cacheSize.addAndGet(valueSize);
149+
Long currentTime = System.currentTimeMillis();
150+
file.setLastModified(currentTime);
151+
lastUsageDates.put(file, currentTime);
152+
}
153+
154+
private void trimCacheSize() {
155+
int curCacheSize = cacheSize.get();
156+
while (curCacheSize > sizeLimit) {
157+
int freedSize = removeNext();
158+
if (freedSize == INVALID_SIZE) break; // cache is empty (have nothing to delete)
159+
curCacheSize = cacheSize.addAndGet(-freedSize);
160+
}
161+
}
162+
124163
/** Remove next file and returns it's size */
125164
private int removeNext() {
126165
if (lastUsageDates.isEmpty()) {

library/src/com/nostra13/universalimageloader/cache/disc/impl/LimitedAgeDiscCache.java

+39-10
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,14 @@
1515
*******************************************************************************/
1616
package com.nostra13.universalimageloader.cache.disc.impl;
1717

18+
import android.graphics.Bitmap;
1819
import com.nostra13.universalimageloader.cache.disc.BaseDiscCache;
1920
import com.nostra13.universalimageloader.cache.disc.naming.FileNameGenerator;
2021
import com.nostra13.universalimageloader.core.DefaultConfigurationFactory;
2122

2223
import java.io.File;
24+
import java.io.IOException;
25+
import java.io.InputStream;
2326
import java.util.Collections;
2427
import java.util.HashMap;
2528
import java.util.Map;
@@ -58,16 +61,9 @@ public LimitedAgeDiscCache(File cacheDir, FileNameGenerator fileNameGenerator, l
5861
}
5962

6063
@Override
61-
public void put(String key, File file) {
62-
long currentTime = System.currentTimeMillis();
63-
file.setLastModified(currentTime);
64-
loadingDates.put(file, currentTime);
65-
}
66-
67-
@Override
68-
public File get(String key) {
69-
File file = super.get(key);
70-
if (file.exists()) {
64+
public File get(String imageUri) {
65+
File file = super.get(imageUri);
66+
if (file != null && file.exists()) {
7167
boolean cached;
7268
Long loadingDate = loadingDates.get(file);
7369
if (loadingDate == null) {
@@ -86,4 +82,37 @@ public File get(String key) {
8682
}
8783
return file;
8884
}
85+
86+
@Override
87+
public boolean save(String imageUri, InputStream imageStream) throws IOException {
88+
boolean saved = super.save(imageUri, imageStream);
89+
rememberUsage(imageUri);
90+
return saved;
91+
}
92+
93+
@Override
94+
public boolean save(String imageUri, Bitmap bitmap, Bitmap.CompressFormat format, int quality) throws IOException {
95+
boolean saved = super.save(imageUri, bitmap, format, quality);
96+
rememberUsage(imageUri);
97+
return saved;
98+
}
99+
100+
@Override
101+
public boolean remove(String imageUri) {
102+
loadingDates.remove(getFile(imageUri));
103+
return super.remove(imageUri);
104+
}
105+
106+
@Override
107+
public void clear() {
108+
super.clear();
109+
loadingDates.clear();
110+
}
111+
112+
private void rememberUsage(String imageUri) {
113+
File file = getFile(imageUri);
114+
long currentTime = System.currentTimeMillis();
115+
file.setLastModified(currentTime);
116+
loadingDates.put(file, currentTime);
117+
}
89118
}

0 commit comments

Comments
 (0)