Java 类com.facebook.cache.common.CacheKey 实例源码
项目:GitHub
文件:PipelineDraweeControllerFactory.java
public void init(
Resources resources,
DeferredReleaser deferredReleaser,
DrawableFactory animatedDrawableFactory,
Executor uiThreadExecutor,
MemoryCache<CacheKey, CloseableImage> memoryCache,
@Nullable ImmutableList<DrawableFactory> drawableFactories,
@Nullable Supplier<Boolean> debugOverlayEnabledSupplier) {
mResources = resources;
mDeferredReleaser = deferredReleaser;
mAnimatedDrawableFactory = animatedDrawableFactory;
mUiThreadExecutor = uiThreadExecutor;
mMemoryCache = memoryCache;
mDrawableFactories = drawableFactories;
mDebugOverlayEnabledSupplier = debugOverlayEnabledSupplier;
}
项目:GitHub
文件:PipelineDraweeControllerFactory.java
public PipelineDraweeController newController(
Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier,
String id,
CacheKey cacheKey,
Object callerContext,
@Nullable ImmutableList<DrawableFactory> customDrawableFactories) {
Preconditions.checkState(mResources != null, "init() not called");
// Field values passed as arguments so that any subclass of PipelineDraweeControllerFactory
// can simply override internalCreateController() and return a custom Drawee controller
PipelineDraweeController controller = internalCreateController(
mResources,
mDeferredReleaser,
mAnimatedDrawableFactory,
mUiThreadExecutor,
mMemoryCache,
mDrawableFactories,
customDrawableFactories,
dataSourceSupplier,
id,
cacheKey,
callerContext);
if (mDebugOverlayEnabledSupplier != null) {
controller.setDrawDebugOverlay(mDebugOverlayEnabledSupplier.get());
}
return controller;
}
项目:GitHub
文件:PipelineDraweeControllerFactory.java
protected PipelineDraweeController internalCreateController(
Resources resources,
DeferredReleaser deferredReleaser,
DrawableFactory animatedDrawableFactory,
Executor uiThreadExecutor,
MemoryCache<CacheKey, CloseableImage> memoryCache,
@Nullable ImmutableList<DrawableFactory> globalDrawableFactories,
@Nullable ImmutableList<DrawableFactory> customDrawableFactories,
Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier,
String id,
CacheKey cacheKey,
Object callerContext) {
PipelineDraweeController controller = new PipelineDraweeController(
resources,
deferredReleaser,
animatedDrawableFactory,
uiThreadExecutor,
memoryCache,
dataSourceSupplier,
id,
cacheKey,
callerContext,
globalDrawableFactories);
controller.setCustomDrawableFactories(customDrawableFactories);
return controller;
}
项目:GitHub
文件:BufferedDiskCache.java
/**
* Writes to disk cache
* @throws IOException
*/
private void writeToDiskCache(
final CacheKey key,
final EncodedImage encodedImage) {
FLog.v(TAG, "About to write to disk-cache for key %s", key.getUriString());
try {
mFileCache.insert(
key, new WriterCallback() {
@Override
public void write(OutputStream os) throws IOException {
mPooledByteStreams.copy(encodedImage.getInputStream(), os);
}
}
);
FLog.v(TAG, "Successful disk-cache write for key %s", key.getUriString());
} catch (IOException ioe) {
// Log failure
// TODO: 3697790
FLog.w(TAG, ioe, "Failed to write to disk-cache for key %s", key.getUriString());
}
}
项目:GitHub
文件:ExperimentalBitmapAnimationDrawableFactory.java
public ExperimentalBitmapAnimationDrawableFactory(
AnimatedDrawableBackendProvider animatedDrawableBackendProvider,
ScheduledExecutorService scheduledExecutorServiceForUiThread,
ExecutorService executorServiceForFramePreparing,
MonotonicClock monotonicClock,
PlatformBitmapFactory platformBitmapFactory,
CountingMemoryCache<CacheKey, CloseableImage> backingCache,
Supplier<Integer> cachingStrategySupplier,
Supplier<Integer> numberOfFramesToPrepareSupplier) {
mAnimatedDrawableBackendProvider = animatedDrawableBackendProvider;
mScheduledExecutorServiceForUiThread = scheduledExecutorServiceForUiThread;
mExecutorServiceForFramePreparing = executorServiceForFramePreparing;
mMonotonicClock = monotonicClock;
mPlatformBitmapFactory = platformBitmapFactory;
mBackingCache = backingCache;
mCachingStrategySupplier = cachingStrategySupplier;
mNumberOfFramesToPrepareSupplier = numberOfFramesToPrepareSupplier;
}
项目:GitHub
文件:AnimatedFrameCacheTest.java
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
MemoryCacheParams params = new MemoryCacheParams(
4 * ByteConstants.MB,
256,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE);
when(mMemoryCacheParamsSupplier.get()).thenReturn(params);
CountingMemoryCache<CacheKey, CloseableImage> countingMemoryCache =
BitmapCountingMemoryCacheFactory.get(
mMemoryCacheParamsSupplier,
mMemoryTrimmableRegistry,
mPlatformBitmapFactory,
true);
mCacheKey = new SimpleCacheKey("key");
mAnimatedFrameCache = new AnimatedFrameCache(mCacheKey, countingMemoryCache);
mFrame1 = CloseableReference.of(mock(CloseableImage.class));
mFrame2 = CloseableReference.of(mock(CloseableImage.class));
}
项目:GitHub
文件:AnimatedFactoryProvider.java
public static AnimatedFactory getAnimatedFactory(
PlatformBitmapFactory platformBitmapFactory,
ExecutorSupplier executorSupplier,
CountingMemoryCache<CacheKey, CloseableImage> backingCache) {
if (!sImplLoaded) {
try {
final Class<?> clazz =
Class.forName("com.facebook.fresco.animation.factory.AnimatedFactoryV2Impl");
final Constructor<?> constructor = clazz.getConstructor(
PlatformBitmapFactory.class,
ExecutorSupplier.class,
CountingMemoryCache.class);
sImpl = (AnimatedFactory) constructor.newInstance(
platformBitmapFactory,
executorSupplier,
backingCache);
} catch (Throwable e) {
// Head in the sand
}
if (sImpl != null) {
sImplLoaded = true;
}
}
return sImpl;
}
项目:GitHub
文件:DiskStorageCache.java
/**
* Probes whether the object corresponding to the mKey is in the cache.
* Note that the act of probing touches the item (if present in cache),
* thus changing its LRU timestamp.
* <p>
* This will be faster than retrieving the object, but it still has
* file system accesses and should NOT be called on the UI thread.
*
* @param key the mKey to check
* @return whether the keyed mValue is in the cache
*/
public boolean probe(final CacheKey key) {
String resourceId = null;
try {
synchronized (mLock) {
List<String> resourceIds = CacheKeyUtil.getResourceIds(key);
for (int i = 0; i < resourceIds.size(); i++) {
resourceId = resourceIds.get(i);
if (mStorage.touch(resourceId, key)) {
mResourceIndex.add(resourceId);
return true;
}
}
return false;
}
} catch (IOException e) {
SettableCacheEvent cacheEvent = SettableCacheEvent.obtain()
.setCacheKey(key)
.setResourceId(resourceId)
.setException(e);
mCacheEventListener.onReadException(cacheEvent);
cacheEvent.recycle();
return false;
}
}
项目:GitHub
文件:DiskStorageCache.java
@Override
public void remove(CacheKey key) {
synchronized (mLock) {
try {
String resourceId = null;
List<String> resourceIds = CacheKeyUtil.getResourceIds(key);
for (int i = 0; i < resourceIds.size(); i++) {
resourceId = resourceIds.get(i);
mStorage.remove(resourceId);
mResourceIndex.remove(resourceId);
}
} catch (IOException e) {
mCacheErrorLogger.logError(
CacheErrorLogger.CacheErrorCategory.DELETE_FILE,
TAG,
"delete: " + e.getMessage(),
e);
}
}
}
项目:GitHub
文件:DiskStorageCache.java
@Override
public boolean hasKey(final CacheKey key) {
synchronized (mLock) {
if (hasKeySync(key)) {
return true;
}
try {
String resourceId = null;
List<String> resourceIds = CacheKeyUtil.getResourceIds(key);
for (int i = 0; i < resourceIds.size(); i++) {
resourceId = resourceIds.get(i);
if (mStorage.contains(resourceId, key)) {
mResourceIndex.add(resourceId);
return true;
}
}
return false;
} catch (IOException e) {
return false;
}
}
}
项目:ModuleFrame
文件:DefaultCacheKeyFactory.java
@Override
public CacheKey getPostprocessedBitmapCacheKey(ImageRequest request, Object callerContext) {
final Postprocessor postprocessor = request.getPostprocessor();
final CacheKey postprocessorCacheKey;
final String postprocessorName;
if (postprocessor != null) {
postprocessorCacheKey = postprocessor.getPostprocessorCacheKey();
postprocessorName = postprocessor.getClass().getName();
} else {
postprocessorCacheKey = null;
postprocessorName = null;
}
return new BitmapMemoryCacheKey(
getCacheKeySourceUri(request.getSourceUri()),
request.getResizeOptions(),
request.getRotationOptions(),
request.getImageDecodeOptions(),
postprocessorCacheKey,
postprocessorName,
callerContext);
}
项目:GitHub
文件:DiskStorageCacheTest.java
/**
* Verify that multiple threads can write to the cache at the same time.
*/
@Test
public void testConcurrency() throws Exception {
final CyclicBarrier barrier = new CyclicBarrier(3);
WriterCallback writerCallback = new WriterCallback() {
@Override
public void write(OutputStream os) throws IOException {
try {
// Both threads will need to hit this barrier. If writing is serialized,
// the second thread will never reach here as the first will hold
// the write lock forever.
barrier.await(10, TimeUnit.SECONDS);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
CacheKey key1 = new SimpleCacheKey("concurrent1");
CacheKey key2 = new SimpleCacheKey("concurrent2");
Thread t1 = runInsertionInSeparateThread(key1, writerCallback);
Thread t2 = runInsertionInSeparateThread(key2, writerCallback);
barrier.await(10, TimeUnit.SECONDS);
t1.join(1000);
t2.join(1000);
}
项目:GitHub
文件:DiskStorageCacheTest.java
private Thread runInsertionInSeparateThread(final CacheKey key,
final WriterCallback callback) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
mCache.insert(key, callback);
} catch (IOException e) {
fail();
}
}
};
Thread thread = new Thread(runnable);
thread.setDaemon(true);
thread.start();
return thread;
}
项目:GitHub
文件:DiskCacheWriteProducer.java
@Override
public void onNewResultImpl(EncodedImage newResult, @Status int status) {
// intermediate, null or uncacheable results are not cached, so we just forward them
if (isNotLast(status) || newResult == null ||
statusHasAnyFlag(status, DO_NOT_CACHE_ENCODED | IS_PARTIAL_RESULT)) {
getConsumer().onNewResult(newResult, status);
return;
}
final ImageRequest imageRequest = mProducerContext.getImageRequest();
final CacheKey cacheKey =
mCacheKeyFactory.getEncodedCacheKey(imageRequest, mProducerContext.getCallerContext());
if (imageRequest.getCacheChoice() == ImageRequest.CacheChoice.SMALL) {
mSmallImageBufferedDiskCache.put(cacheKey, newResult);
} else {
mDefaultBufferedDiskCache.put(cacheKey, newResult);
}
getConsumer().onNewResult(newResult, status);
}
项目:GitHub
文件:DiskStorageCacheTest.java
private String verifyListenerOnWriteSuccessAndGetResourceId(
CacheKey key,
long itemSize) {
ArgumentCaptor<CacheEvent> cacheEventCaptor = ArgumentCaptor.forClass(CacheEvent.class);
mCacheEventListenerInOrder.verify(mCacheEventListener)
.onWriteSuccess(cacheEventCaptor.capture());
CacheEvent cacheEvent = cacheEventCaptor.getValue();
CacheEventAssert.assertThat(cacheEvent)
.isNotNull()
.hasCacheKey(key)
.hasItemSize(itemSize)
.hasResourceIdSet();
return cacheEvent.getResourceId();
}
项目:GitHub
文件:EncodedMemoryCacheFactory.java
public static MemoryCache<CacheKey, PooledByteBuffer> get(
final CountingMemoryCache<CacheKey, PooledByteBuffer> encodedCountingMemoryCache,
final ImageCacheStatsTracker imageCacheStatsTracker) {
imageCacheStatsTracker.registerEncodedMemoryCache(encodedCountingMemoryCache);
MemoryCacheTracker memoryCacheTracker = new MemoryCacheTracker<CacheKey>() {
@Override
public void onCacheHit(CacheKey cacheKey) {
imageCacheStatsTracker.onMemoryCacheHit(cacheKey);
}
@Override
public void onCacheMiss() {
imageCacheStatsTracker.onMemoryCacheMiss();
}
@Override
public void onCachePut() {
imageCacheStatsTracker.onMemoryCachePut();
}
};
return new InstrumentedMemoryCache<>(encodedCountingMemoryCache, memoryCacheTracker);
}
项目:GitHub
文件:BaseFrescoStethoPlugin.java
private void writeCacheEntry(
PrintStream writer,
CountingMemoryCacheInspector.DumpInfoEntry<CacheKey, CloseableImage> entry) {
if (!(entry.key instanceof BitmapMemoryCacheKey)) {
writer.println("Undefined: " + entry.key.getClass());
}
BitmapMemoryCacheKey cacheKey = (BitmapMemoryCacheKey) entry.key;
writer.println(formatStrLocaleSafe(
"size: %7.2fkB (%4d x %4d) key: %s, %s, duration: %dms",
entry.value.get().getSizeInBytes() / KB,
entry.value.get().getWidth(),
entry.value.get().getHeight(),
entry.key,
cacheKey.getCallerContext(),
RealtimeSinceBootClock.get().now() - cacheKey.getInBitmapCacheSince()));
}
项目:GitHub
文件:MediaVariationsFallbackProducerTest.java
@Test
public void testDoesNotWriteToIndexIfPartialResult() {
when(mImageRequest.getMediaVariations()).thenReturn(mEmptyMediaVariations);
setupInputProducerSuccessWithStatusFlags(Consumer.IS_PARTIAL_RESULT);
mMediaVariationsFallbackProducer.produceResults(mConsumer, mProducerContext);
verify(mConsumer).onNewResult(mIntermediateEncodedImage, Consumer.IS_PARTIAL_RESULT);
verify(mConsumer)
.onNewResult(mFinalEncodedImage, Consumer.IS_LAST | Consumer.IS_PARTIAL_RESULT);
verify(mMediaVariationsIndex, never()).saveCachedVariant(
anyString(),
any(CacheChoice.class),
any(CacheKey.class),
any(EncodedImage.class));
}
项目:GitHub
文件:DefaultCacheKeyFactory.java
@Override
public CacheKey getPostprocessedBitmapCacheKey(ImageRequest request, Object callerContext) {
final Postprocessor postprocessor = request.getPostprocessor();
final CacheKey postprocessorCacheKey;
final String postprocessorName;
if (postprocessor != null) {
postprocessorCacheKey = postprocessor.getPostprocessorCacheKey();
postprocessorName = postprocessor.getClass().getName();
} else {
postprocessorCacheKey = null;
postprocessorName = null;
}
return new BitmapMemoryCacheKey(
getCacheKeySourceUri(request.getSourceUri()).toString(),
request.getResizeOptions(),
request.getRotationOptions(),
request.getImageDecodeOptions(),
postprocessorCacheKey,
postprocessorName,
callerContext);
}
项目:GitHub
文件:PartialDiskCacheProducer.java
public void produceResults(
final Consumer<EncodedImage> consumer,
final ProducerContext producerContext) {
final ImageRequest imageRequest = producerContext.getImageRequest();
if (!imageRequest.isDiskCacheEnabled()) {
mInputProducer.produceResults(consumer, producerContext);
return;
}
producerContext.getListener().onProducerStart(producerContext.getId(), PRODUCER_NAME);
final Uri uriForPartialCacheKey = createUriForPartialCacheKey(imageRequest);
final CacheKey partialImageCacheKey = mCacheKeyFactory.getEncodedCacheKey(
imageRequest,
uriForPartialCacheKey,
producerContext.getCallerContext());
final AtomicBoolean isCancelled = new AtomicBoolean(false);
final Task<EncodedImage> diskLookupTask =
mDefaultBufferedDiskCache.get(partialImageCacheKey, isCancelled);
final Continuation<EncodedImage, Void> continuation =
onFinishDiskReads(consumer, producerContext, partialImageCacheKey);
diskLookupTask.continueWith(continuation);
subscribeTaskForRequestCancellation(isCancelled, producerContext);
}
项目:GitHub
文件:DiskCacheReadProducer.java
public void produceResults(
final Consumer<EncodedImage> consumer,
final ProducerContext producerContext) {
final ImageRequest imageRequest = producerContext.getImageRequest();
if (!imageRequest.isDiskCacheEnabled()) {
maybeStartInputProducer(consumer, producerContext);
return;
}
producerContext.getListener().onProducerStart(producerContext.getId(), PRODUCER_NAME);
final CacheKey cacheKey =
mCacheKeyFactory.getEncodedCacheKey(imageRequest, producerContext.getCallerContext());
final boolean isSmallRequest = (imageRequest.getCacheChoice() == CacheChoice.SMALL);
final BufferedDiskCache preferredCache = isSmallRequest ?
mSmallImageBufferedDiskCache : mDefaultBufferedDiskCache;
final AtomicBoolean isCancelled = new AtomicBoolean(false);
final Task<EncodedImage> diskLookupTask = preferredCache.get(cacheKey, isCancelled);
final Continuation<EncodedImage, Void> continuation =
onFinishDiskReads(consumer, producerContext);
diskLookupTask.continueWith(continuation);
subscribeTaskForRequestCancellation(isCancelled, producerContext);
}
项目:GitHub
文件:ImagePipelineExperiments.java
ProducerFactory createProducerFactory(
Context context,
ByteArrayPool byteArrayPool,
ImageDecoder imageDecoder,
ProgressiveJpegConfig progressiveJpegConfig,
boolean downsampleEnabled,
boolean resizeAndRotateEnabledForNetwork,
boolean decodeCancellationEnabled,
Supplier<Boolean> experimentalSmartResizingEnabled,
ExecutorSupplier executorSupplier,
PooledByteBufferFactory pooledByteBufferFactory,
MemoryCache<CacheKey, CloseableImage> bitmapMemoryCache,
MemoryCache<CacheKey, PooledByteBuffer> encodedMemoryCache,
BufferedDiskCache defaultBufferedDiskCache,
BufferedDiskCache smallImageBufferedDiskCache,
MediaVariationsIndex mediaVariationsIndex,
CacheKeyFactory cacheKeyFactory,
PlatformBitmapFactory platformBitmapFactory,
int bitmapPrepareToDrawMinSizeBytes,
int bitmapPrepareToDrawMaxSizeBytes,
boolean bitmapPrepareToDrawForPrefetch);
项目:GitHub
文件:BitmapMemoryCacheKey.java
public BitmapMemoryCacheKey(
String sourceString,
@Nullable ResizeOptions resizeOptions,
RotationOptions rotationOptions,
ImageDecodeOptions imageDecodeOptions,
@Nullable CacheKey postprocessorCacheKey,
@Nullable String postprocessorName,
Object callerContext) {
mSourceString = Preconditions.checkNotNull(sourceString);
mResizeOptions = resizeOptions;
mRotationOptions = rotationOptions;
mImageDecodeOptions = imageDecodeOptions;
mPostprocessorCacheKey = postprocessorCacheKey;
mPostprocessorName = postprocessorName;
mHash = HashCodeUtil.hashCode(
sourceString.hashCode(),
(resizeOptions != null) ? resizeOptions.hashCode() : 0,
rotationOptions.hashCode(),
mImageDecodeOptions,
mPostprocessorCacheKey,
postprocessorName);
mCallerContext = callerContext;
mCacheTime = RealtimeSinceBootClock.get().now();
}
项目:GitHub
文件:PipelineDraweeControllerFactory.java
public PipelineDraweeController newController(
Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier,
String id,
CacheKey cacheKey,
Object callerContext) {
return newController(dataSourceSupplier, id, cacheKey, callerContext, null);
}
项目:GitHub
文件:CachedWatermarkPostprocessor.java
@Override
public CacheKey getPostprocessorCacheKey() {
return new SimpleCacheKey(String.format(
(Locale) null,
"text=%s,count=%d",
mWatermarkText,
mCount));
}
项目:GitHub
文件:PipelineDraweeController.java
/**
* Initializes this controller with the new data source supplier, id and caller context. This
* allows for reusing of the existing controller instead of instantiating a new one. This method
* should be called when the controller is in detached state.
*
* @param dataSourceSupplier data source supplier
* @param id unique id for this controller
* @param callerContext tag and context for this controller
*/
public void initialize(
Supplier<DataSource<CloseableReference<CloseableImage>>> dataSourceSupplier,
String id,
CacheKey cacheKey,
Object callerContext,
@Nullable ImmutableList<DrawableFactory> customDrawableFactories) {
super.initialize(id, callerContext);
init(dataSourceSupplier);
mCacheKey = cacheKey;
setCustomDrawableFactories(customDrawableFactories);
}
项目:GitHub
文件:AnimatedFactoryV2Impl.java
@DoNotStrip
public AnimatedFactoryV2Impl(
PlatformBitmapFactory platformBitmapFactory,
ExecutorSupplier executorSupplier,
CountingMemoryCache<CacheKey, CloseableImage> backingCache) {
mPlatformBitmapFactory = platformBitmapFactory;
mExecutorSupplier = executorSupplier;
mBackingCache = backingCache;
}
项目:cardinalsSample
文件:FrescoManager.java
/**
* 将图片插入缓存
*
* @param key 保存文件的可以
* @param inputStream 图片转化成的InputStream
* @return 是否插入成功
*/
public static boolean insertImageToCache(String key, InputStream inputStream) {
try {
CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(ImageRequest.fromUri(key), null);
ImagePipelineFactory.getInstance().getMainFileCache().insert(cacheKey, WriterCallbacks.from(inputStream));
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
CloseUtil.close(inputStream);
}
return true;
}
项目:GitHub
文件:AnimatedFrameCache.java
public AnimatedFrameCache(
CacheKey imageCacheKey,
final CountingMemoryCache<CacheKey, CloseableImage> backingCache) {
mImageCacheKey = imageCacheKey;
mBackingCache = backingCache;
mFreeItemsPool = new LinkedHashSet<>();
mEntryStateObserver = new CountingMemoryCache.EntryStateObserver<CacheKey>() {
@Override
public void onExclusivityChanged(CacheKey key, boolean isExclusive) {
AnimatedFrameCache.this.onReusabilityChange(key, isExclusive);
}
};
}
项目:GitHub
文件:AnimatedFrameCache.java
public synchronized void onReusabilityChange(CacheKey key, boolean isReusable) {
if (isReusable) {
mFreeItemsPool.add(key);
} else {
mFreeItemsPool.remove(key);
}
}
项目:GitHub
文件:AnimatedFrameCache.java
/**
* Gets the image to be reused, or null if there is no such image.
*
* <p> The returned image is the least recently used image that has no more clients referencing
* it, and it has not yet been evicted from the cache.
*
* <p> The client can freely modify the bitmap of the returned image and can cache it again
* without any restrictions.
*/
@Nullable
public CloseableReference<CloseableImage> getForReuse() {
while (true) {
CacheKey key = popFirstFreeItemKey();
if (key == null) {
return null;
}
CloseableReference<CloseableImage> imageRef = mBackingCache.reuse(key);
if (imageRef != null) {
return imageRef;
}
}
}
项目:GitHub
文件:AnimatedFrameCache.java
@Nullable
private synchronized CacheKey popFirstFreeItemKey() {
CacheKey cacheKey = null;
Iterator<CacheKey> iterator = mFreeItemsPool.iterator();
if (iterator.hasNext()) {
cacheKey = iterator.next();
iterator.remove();
}
return cacheKey;
}
项目:GitHub
文件:BitmapCountingMemoryCacheFactory.java
public static CountingMemoryCache<CacheKey, CloseableImage> get(
Supplier<MemoryCacheParams> bitmapMemoryCacheParamsSupplier,
MemoryTrimmableRegistry memoryTrimmableRegistry,
PlatformBitmapFactory platformBitmapFactory,
boolean isExternalCreatedBitmapLogEnabled,
CountingMemoryCache.CacheTrimStrategy trimStrategy) {
ValueDescriptor<CloseableImage> valueDescriptor =
new ValueDescriptor<CloseableImage>() {
@Override
public int getSizeInBytes(CloseableImage value) {
return value.getSizeInBytes();
}
};
CountingMemoryCache<CacheKey, CloseableImage> countingCache =
new CountingMemoryCache<>(
valueDescriptor,
trimStrategy,
bitmapMemoryCacheParamsSupplier,
platformBitmapFactory,
isExternalCreatedBitmapLogEnabled);
memoryTrimmableRegistry.registerMemoryTrimmable(countingCache);
return countingCache;
}
项目:GitHub
文件:DiskStorageCache.java
/**
* Retrieves the file corresponding to the mKey, if it is in the cache. Also
* touches the item, thus changing its LRU timestamp. If the file is not
* present in the file cache, returns null.
* <p>
* This should NOT be called on the UI thread.
*
* @param key the mKey to check
* @return The resource if present in cache, otherwise null
*/
@Override
public BinaryResource getResource(final CacheKey key) {
String resourceId = null;
SettableCacheEvent cacheEvent = SettableCacheEvent.obtain()
.setCacheKey(key);
try {
synchronized (mLock) {
BinaryResource resource = null;
List<String> resourceIds = CacheKeyUtil.getResourceIds(key);
for (int i = 0; i < resourceIds.size(); i++) {
resourceId = resourceIds.get(i);
cacheEvent.setResourceId(resourceId);
resource = mStorage.getResource(resourceId, key);
if (resource != null) {
break;
}
}
if (resource == null) {
mCacheEventListener.onMiss(cacheEvent);
mResourceIndex.remove(resourceId);
} else {
mCacheEventListener.onHit(cacheEvent);
mResourceIndex.add(resourceId);
}
return resource;
}
} catch (IOException ioe) {
mCacheErrorLogger.logError(
CacheErrorLogger.CacheErrorCategory.GENERIC_IO,
TAG,
"getResource",
ioe);
cacheEvent.setException(ioe);
mCacheEventListener.onReadException(cacheEvent);
return null;
} finally {
cacheEvent.recycle();
}
}
项目:GitHub
文件:DiskStorageCache.java
/**
* Creates a temp file for writing outside the session lock
*/
private DiskStorage.Inserter startInsert(
final String resourceId,
final CacheKey key)
throws IOException {
maybeEvictFilesInCacheDir();
return mStorage.insert(resourceId, key);
}
项目:GitHub
文件:DiskStorageCache.java
/**
* Commits the provided temp file to the cache, renaming it to match
* the cache's hashing convention.
*/
private BinaryResource endInsert(
final DiskStorage.Inserter inserter,
final CacheKey key,
String resourceId) throws IOException {
synchronized (mLock) {
BinaryResource resource = inserter.commit(key);
mResourceIndex.add(resourceId);
mCacheStats.increment(resource.size(), 1);
return resource;
}
}
项目:GitHub
文件:DiskStorageCache.java
@Override
public BinaryResource insert(CacheKey key, WriterCallback callback) throws IOException {
// Write to a temp file, then move it into place. This allows more parallelism
// when writing files.
SettableCacheEvent cacheEvent = SettableCacheEvent.obtain()
.setCacheKey(key);
mCacheEventListener.onWriteAttempt(cacheEvent);
String resourceId;
synchronized (mLock) {
// for multiple resource ids associated with the same image, we only write one file
resourceId = CacheKeyUtil.getFirstResourceId(key);
}
cacheEvent.setResourceId(resourceId);
try {
// getting the file is synchronized
DiskStorage.Inserter inserter = startInsert(resourceId, key);
try {
inserter.writeData(callback, key);
// Committing the file is synchronized
BinaryResource resource = endInsert(inserter, key, resourceId);
cacheEvent.setItemSize(resource.size())
.setCacheSize(mCacheStats.getSize());
mCacheEventListener.onWriteSuccess(cacheEvent);
return resource;
} finally {
if (!inserter.cleanUp()) {
FLog.e(TAG, "Failed to delete temp file");
}
}
} catch (IOException ioe) {
cacheEvent.setException(ioe);
mCacheEventListener.onWriteException(cacheEvent);
FLog.e(TAG, "Failed inserting a file into the cache", ioe);
throw ioe;
} finally {
cacheEvent.recycle();
}
}
项目:GitHub
文件:BitmapMemoryCacheKeyMultiplexProducer.java
protected Pair<CacheKey, ImageRequest.RequestLevel> getKey(
ProducerContext producerContext) {
return Pair.create(
mCacheKeyFactory.getBitmapCacheKey(
producerContext.getImageRequest(),
producerContext.getCallerContext()),
producerContext.getLowestPermittedRequestLevel());
}
项目:GitHub
文件:BitmapMemoryCacheGetProducer.java
@Override
protected Consumer<CloseableReference<CloseableImage>> wrapConsumer(
final Consumer<CloseableReference<CloseableImage>> consumer,
final CacheKey cacheKey) {
// since this cache is read-only, we can pass our consumer directly to the next producer
return consumer;
}
项目:GitHub
文件:DiskStorageCacheTest.java
@Test
public void testCacheEventListener() throws Exception {
// 1. Add first cache file
CacheKey key1 = new SimpleCacheKey("foo");
int value1Size = 101;
byte[] value1 = new byte[value1Size];
value1[80] = 'c'; // just so it's not all zeros for the equality test below.
BinaryResource resource1 = mCache.insert(key1, WriterCallbacks.from(value1));
verifyListenerOnWriteAttempt(key1);
String resourceId1 = verifyListenerOnWriteSuccessAndGetResourceId(key1, value1Size);
BinaryResource resource1Again = mCache.getResource(key1);
assertEquals(resource1, resource1Again);
verifyListenerOnHit(key1, resourceId1);
BinaryResource resource1Again2 = mCache.getResource(key1);
assertEquals(resource1, resource1Again2);
verifyListenerOnHit(key1, resourceId1);
SimpleCacheKey missingKey = new SimpleCacheKey("nonexistent_key");
BinaryResource res2 = mCache.getResource(missingKey);
assertNull(res2);
verifyListenerOnMiss(missingKey);
mCache.clearAll();
verify(mCacheEventListener).onCleared();
verifyNoMoreInteractions(mCacheEventListener);
}