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 はデータベースではないため、後でデータに選択的にアクセスすることはできません。

おそらくRS ORMLiteモジュールを使用して、ORMLiteを使用して、DB内のデータのシリアル化に移行する必要があると答えることができます。これにより、個別のテーブルにデータを保存し、後でそれらを選択的に取得できるようになります。

それにもかかわらず、ここでの本当の答えは、そのような大量のデータをダウンロードするのをやめるか、バイナリ形式 (protobuf、kryo ?) のようなものを使用して、データベース内にデータを保存する必要があるということです。

しかし、最も単純でより一般的な解決策は、実際には少量のデータをダウンロードすることです。

于 2013-08-15T08:42:16.613 に答える