2013-07-07 25 views
1

我有一个SpiceRequest,它的任务是预先缓存一堆数据,然后可以单独加载到单独的SpiceRequests中。例如,假设我的应用程序通过SpiceRequest为特定剧院下载电影时间,我需要一个复合SpiceRequest,用于下载并预缓存区域中所有剧院的所有电影时间。Robospice:从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); 
     } 
    } 
} 

在此先感谢...

回答

1

如果结果是太大,杰克逊进行处理,这可能是一个设计问题。

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

在RS中,由REST请求产生的所有数据都将直接保存,并且以后不可能再分割它们。 Jackson/Gson系列化至少是这样。 Json不是一个数据库,以后不能再给你一个选择性的数据访问权限。

我可以回答说,你应该走向数据库中的数据序列化,使用ORMLite,可能与RS ORMLite模块,可以让你存储在不同的表中的东西,以后你将能够选择性地检索它们。然而,真正的答案在于你应该从下载如此大量的数据,或者可能使用类似二进制格式(protobuf,kryo?)的东西,并将内容存储到数据库中。

但最简单和更常见的解决方案是真正下载少量的数据。