2013-07-07 52 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?)的東西,並將內容存儲到數據庫中。

但最簡單和更常見的解決方案是真正下載少量的數據。