如何在谷歌云端点缓存响应?

时间:2015-11-02 19:37:52

标签: android caching google-cloud-endpoints

我正在制作一个使用谷歌云终端作为后端的Android应用程序。所以我在应用程序中提出请求。我想在内存和存储中缓存这些请求的响应。

我想在手机上缓存响应,这样我就不必再做不必要的重复网络请求了。

我在互联网上搜索了一些内置的解决方案,但在google提供的api中找不到类似的内容。

我想要缓存大约2MB的数据。该数据分布在20个终点请求中。

实施此类缓存的最佳选择是什么?

2 个答案:

答案 0 :(得分:0)

我将回答我自己的问题,以便它可以帮助某人,直到有更清晰的解决方案可用。

我正在使用此库来缓存响应:https://github.com/vincentbrison/android-easy-cache

  1. GCE结果为GenericJson。使用此SerializationUtil
  2. 序列化响应
  3. 使用此代码创建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;
    }
    
  4. 现在使用上述DualCache来缓存您的回复。

    getDualCacheByteArray().put(YOUR_RESPONSE_CACHE_KEY, serializedProduct);
    getDualCacheDate().put(YOUR_RESPONSE_CACHE_KEY, new Date());
    
  5. 在使用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;
        }
    }
    
  6. 如果缓存的字节数组不为null,则使用SerializationUtil对其进行反序列化并将其用作缓存响应,否则从Google云端点发出新请求

    编辑:如Sanket Berde在其他答案中指出的那样,在每种情况下都不一定需要使用序列化工具

答案 1 :(得分:0)

您可以实现一个名为android-easy-cache

的神奇图书馆

示例实现显示在我的回答here