mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-26 22:43:05 +00:00
Cache WeakReferences to our box art bitmaps after LRU evictions
This commit is contained in:
parent
b5bd329ada
commit
4587c1550d
@ -5,6 +5,9 @@ import android.util.LruCache;
|
|||||||
|
|
||||||
import com.limelight.LimeLog;
|
import com.limelight.LimeLog;
|
||||||
|
|
||||||
|
import java.lang.ref.WeakReference;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
public class MemoryAssetLoader {
|
public class MemoryAssetLoader {
|
||||||
private static final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
|
private static final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
|
||||||
private static final LruCache<String, Bitmap> memoryCache = new LruCache<String, Bitmap>(maxMemory / 16) {
|
private static final LruCache<String, Bitmap> memoryCache = new LruCache<String, Bitmap>(maxMemory / 16) {
|
||||||
@ -13,18 +16,51 @@ public class MemoryAssetLoader {
|
|||||||
// Sizeof returns kilobytes
|
// Sizeof returns kilobytes
|
||||||
return bitmap.getByteCount() / 1024;
|
return bitmap.getByteCount() / 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
|
||||||
|
super.entryRemoved(evicted, key, oldValue, newValue);
|
||||||
|
|
||||||
|
if (evicted) {
|
||||||
|
// Keep a weak reference around to the bitmap as long as we can
|
||||||
|
evictionCache.put(key, new WeakReference<>(oldValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
private static final HashMap<String, WeakReference<Bitmap>> evictionCache = new HashMap<>();
|
||||||
|
|
||||||
private static String constructKey(CachedAppAssetLoader.LoaderTuple tuple) {
|
private static String constructKey(CachedAppAssetLoader.LoaderTuple tuple) {
|
||||||
return tuple.computer.uuid+"-"+tuple.app.getAppId();
|
return tuple.computer.uuid+"-"+tuple.app.getAppId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap loadBitmapFromCache(CachedAppAssetLoader.LoaderTuple tuple) {
|
public Bitmap loadBitmapFromCache(CachedAppAssetLoader.LoaderTuple tuple) {
|
||||||
Bitmap bmp = memoryCache.get(constructKey(tuple));
|
final String key = constructKey(tuple);
|
||||||
|
|
||||||
|
Bitmap bmp = memoryCache.get(key);
|
||||||
if (bmp != null) {
|
if (bmp != null) {
|
||||||
LimeLog.info("Memory cache hit for tuple: "+tuple);
|
LimeLog.info("LRU cache hit for tuple: "+tuple);
|
||||||
|
return bmp;
|
||||||
}
|
}
|
||||||
return bmp;
|
|
||||||
|
WeakReference<Bitmap> bmpRef = evictionCache.get(key);
|
||||||
|
if (bmpRef != null) {
|
||||||
|
bmp = bmpRef.get();
|
||||||
|
if (bmp != null) {
|
||||||
|
LimeLog.info("Eviction cache hit for tuple: "+tuple);
|
||||||
|
|
||||||
|
// Put this entry back into the LRU cache
|
||||||
|
evictionCache.remove(key);
|
||||||
|
memoryCache.put(key, bmp);
|
||||||
|
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// The data is gone, so remove the dangling WeakReference now
|
||||||
|
evictionCache.remove(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void populateCache(CachedAppAssetLoader.LoaderTuple tuple, Bitmap bitmap) {
|
public void populateCache(CachedAppAssetLoader.LoaderTuple tuple, Bitmap bitmap) {
|
||||||
@ -32,6 +68,8 @@ public class MemoryAssetLoader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void clearCache() {
|
public void clearCache() {
|
||||||
|
// We must evict first because that will push all items into the eviction cache
|
||||||
memoryCache.evictAll();
|
memoryCache.evictAll();
|
||||||
|
evictionCache.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user