我正在制作一个使用谷歌云终端作为后端的Android应用程序。所以我在应用程序中提出请求。我想在内存和存储中缓存这些请求的响应。
我想在手机上缓存响应,这样我就不必再做不必要的重复网络请求了。
我在互联网上搜索了一些内置的解决方案,但在google提供的api中找不到类似的内容。
我想要缓存大约2MB的数据。该数据分布在20个终点请求中。
实施此类缓存的最佳选择是什么?
答案 0 :(得分:0)
我将回答我自己的问题,以便它可以帮助某人,直到有更清晰的解决方案可用。
我正在使用此库来缓存响应:https://github.com/vincentbrison/android-easy-cache
GenericJson
。使用此SerializationUtil 使用此代码创建DualCache库样板。 dualCacheByteArray
用于缓存回复,dualCacheDate
用于跟踪time_to_live_for_response
public static final int APP_CACHE_VERSION = 1;
public static final String CACHE_ID = "cache_id_string";
public static final String CACHE_ID_DATE = "cache_id_date";
public static final int RAM_CACHE_SIZE = 5 * 1024 * 1024; // 5 mb
public static final int DISK_CACHE_SIZE = 15 * 1024 * 1024; //15 mb
public static final int RAM_CACHE_SIZE_DATE = 1 * 1024 * 1024; // 5 mb
public static final int DISK_CACHE_SIZE_DATE = 3 * 1024 * 1024; //15 mb
private DualCache<byte[]> dualCacheByteArray;
private DualCache<Date> dualCacheDate;
public DualCache<byte[]> getDualCacheByteArray() {
if (dualCacheByteArray == null) {
dualCacheByteArray = new DualCacheBuilder<byte[]>(Constants.CACHE_ID, Constants.APP_CACHE_VERSION, byte[].class)
.useReferenceInRam(Constants.RAM_CACHE_SIZE, new SizeOf<byte[]>() {
@Override
public int sizeOf(byte[] object) {
return object.length;
}
})
.useDefaultSerializerInDisk(Constants.DISK_CACHE_SIZE, true);
}
return dualCacheByteArray;
}
public DualCache<Date> getDualCacheDate() {
if (dualCache == null) {
dualCacheDate = new DualCacheBuilder<Date>(Constants.CACHE_ID_DATE, Constants.APP_CACHE_VERSION, Date.class)
.useReferenceInRam(Constants.RAM_CACHE_SIZE_DATE, new SizeOf<Date>() {
@Override
public int sizeOf(Date date) {
byte[] b = new byte[0];
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(date);
oos.flush();
byte[] buf = baos.toByteArray();
return buf.length;
} catch (IOException e) {
Log.e("some prob", "error in calculating date size for caching", e);
}
return sizeOf(date);
}
})
.useDefaultSerializerInDisk(Constants.DISK_CACHE_SIZE_DATE, true);
}
return dualCacheDate;
}
现在使用上述DualCache
来缓存您的回复。
getDualCacheByteArray().put(YOUR_RESPONSE_CACHE_KEY, serializedProduct);
getDualCacheDate().put(YOUR_RESPONSE_CACHE_KEY, new Date());
在使用Google云端点发出新请求之前,如果旧响应已存在于缓存中,则应检入双缓存
public byte[] getCachedGenericJsonByteArray(String key, int cacheExpireTimeInMinutes) {
Date cachingDate = getDualCacheDate().get(key);
if(cachingDate!=null) {
long expirationTime = TimeUnit.MILLISECONDS.convert(cacheExpireTimeInMinutes, TimeUnit.MINUTES);
long timeElapsedAfterCaching = new Date().getTime() - cachingDate.getTime();
if (timeElapsedAfterCaching >= expirationTime) {
//the cached data has expired
return null;
} else {
byte[] cachedGenericJsonByteArray = getDualCacheByteArray().get(key);
return cachedGenericJsonByteArray;
}
} else {
//result for this key was never cached or is cleared
return null;
}
}
如果缓存的字节数组不为null,则使用SerializationUtil对其进行反序列化并将其用作缓存响应,否则从Google云端点发出新请求
编辑:如Sanket Berde在其他答案中指出的那样,在每种情况下都不一定需要使用序列化工具
答案 1 :(得分:0)
您可以实现一个名为android-easy-cache
的神奇图书馆示例实现显示在我的回答here
中