1

我有一个 SpiceRequest,它的工作是预先缓存一堆数据,然后可以在单独的 SpiceRequests 中单独加载。

例如,假设我的应用程序通过 SpiceRequest 下载特定影院的电影时间,我需要一个复合 SpiceRequest 来下载并预缓存一个地区所有影院的所有电影时间。

让我们称之为 AllMoviesSpiceRequest,它是 SpringAndroidSpiceRequest 的子类。它的 loadDataFromNetwork() 方法多次调用 getRestTemplate().getForObject()。它将所有数据放入一个包含对象并返回它。

我的计划是调用 onRequestSuccess 为每个剧院调用 SpiceManager.putInCache。问题是所有影院的数据集都很大,大约 16 MB,并且由于 JsonWriter.string() 无法序列化那么大的字符串,因此出现 OutOfMemory 错误。

是否可以在下载时直接从 AllMoviesSpiceRequest 缓存每个影院?我不确定从 SpiceRequest 创建和调用 SpiceManager 是否安全。还是有更好的方法可以采取?

这是一些示例代码,可以为您提供想法:

public class AllMoviesSpiceRequest extends 
    SpringAndroidSpiceRequest<AllMovieTimes> {

    public AllMovieTimes loadDataFromNetwork() throws Exception {

        AllMovieTimes allMovieTimes = new AllMovieTimes();

        // Get all the theaters
        Theaters theaters = getRestTemplate().getForObject(
            THEATER_JSON_URL + "/" + regionId, Theaters.class);

        // Get all the movies
        for(Theater t : theaters.all()) {
            MovieTimes mt = getRestTemplate().getForObject(
                MOVIES_JSON_URL + "/" + t.getId(), MovieTimes.class);

            allMovieTimes.add(mt);
            // Can I call spiceManager.putInCacheHere???
        }

        // OutOfMemoryError!!!
        return allMovieTimes; 
    }
}

private class AllMoviesRequestListener implements 
    RequestListener<AllMovieTimes> { 

    public void onRequestSuccess(AllMovieTimes allMovieTimes) {

        // Add all the movies to the cache
        for(MovieTime mt : allMovieTimes) {
            spiceManager.putInCache(mt.getCacheKey(), mt);
        }
    }
}

提前致谢...

4

1 回答 1

1

如果您的结果太大而无法由 Jackson 处理,则可能是设计问题。

实际上拥有 16 MB 的 json 对于移动设备来说并不是一个好的解决方案。它会让你的用户在很长一段时间内都能使用可用的手机,而这不是 Android 应用程序应该工作的方式。即使 RS 允许在后台下载数据,您也应该真正关心响应能力。

在 RS 中,REST 请求产生的所有数据都将直接保存,以后无法拆分它们。至少这对于 Jackson/Gson 序列化是正确的。Json 不是数据库,以后无法让您选择性地访问数据。

我可以回答说,您应该使用 ORMLite(可能使用 RS ORMLite 模块)对数据库中的数据进行序列化,这可以让您将内容存储在单独的表中,然后您可以有选择地检索它们。

然而,真正的答案是,您应该远离下载如此大量的数据,或者可能使用二进制格式(protobuf、kryo ?)之类的东西并将内容存储在数据库中。

但最简单、更常见的解决方案实际上是下载更少量的数据。

于 2013-08-15T08:42:16.613 回答