私は 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);
}
}
}
前もって感謝します...