java - Robospice:从 SpiceRequest 保存到缓存

标签 java android robospice

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

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

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

我的计划是在调用 onRequestSuccess 时为每个影院调用 SpiceManager.putInCache。问题是所有影院的数据集都很大,大约 16 MB,并且由于 JsonWriter.string() 无法序列化这么大的字符串而导致内存不足错误。

是否可以在下载时直接从 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);
        }
    }
}

提前致谢...

最佳答案

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

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

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

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

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

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

关于java - Robospice:从 SpiceRequest 保存到缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17509134/

相关文章:

android - 如何获取 android 中所有设备管理员( Activity 和非 Activity )的列表?

android - 如何测试 Robospice GoogleHttpClientSpiceRequest?当前正在为 HttpRequestFactory 获取 NullPointerException

java - 如何将剪贴板中的文本发送到EditText框

java - 如何在Android中记录和解析InputStream

android - 如何从 Windows 修改 Genymotion VM 上的主机文件?

android - 虚线显示在图形布局中,但不显示在设备上

android - 使用 RoboSpice 有没有办法从异常中获取 HTTP 错误代码?

android - 在 RoboSpice 中仅将 TLS 与 Retrofit 结合使用

java - 将长解析为负数

java - 匿名类声明中的语句