1

オフラインの JSON 定義 (アセット フォルダー内) があり、それらを使用してデータ モデルを作成します。1 つの抽象モデル クラスをすべて継承 (拡張) する 8 つのクラスがあります。

アプリのライフ サイクル全体を通じて、JSON を解析し、モデルをメモリに保持する (多かれ少なかれすべてが整数または文字列である) 場合は、より良い解決策でしょうか?

ありがとう

4

2 に答える 2

3

ファイルを解析し、すべてのデータをメモリに保存すると、間違いなく速度が向上します。このソリューションの問題点は、アプリケーションがバックグラウンドに移行した場合 (ユーザーが電話を受けるか、単にアプリを離れた場合)、データがメモリ内にそのまま残ることを誰も保証できないことです。

システムがより多くのメモリが必要であると判断した場合、このデータは GC によってクリアされる可能性があります。

これは、ユーザーがアプリケーションに戻ったときに、データがメモリ内にあるという事実を中継すると、例外に直面する可能性があることを意味します。したがって、この状況を考慮する必要があります。

そして、あなたのその時点から、これがより遅い解決策かもしれないとはいえ、希望する時間に解析できるファイルにデータを保存することは良いことです.

別の解決策として、アプリケーションの最初の起動時にこのデータを解析して SQLite DB に保存し、そこから使用するか、最初に DB に保存することもできます。これにより、両方の利点が得られます。データを使用する前にデータを解析する必要がなく、 を使用してデータにすばやくアクセスできますCursor。システム。

于 2013-05-12T11:57:54.673 に答える
1

すべてのファイル コンテンツを一度に読み取り、それをアプリケーション内のどこかに静的な文字列として保持し、すべてのアプリケーション コンポーネント ( SingleTone パターン) で使用できるようにします。通常、メモリ内に小さな文字列を維持する方が、頻繁にファイルを開いたり閉じたりするよりもはるかに安価だからです。 .

@Emil が指摘したGCポイントを解決するには、次のようなコードを記述します。

    public class DataManager {
    private static String myData;
    public static String getData(Context context){
        if(myData == null){
            loadData(context);
        }
        return myData;
    }
    private static void LoadData(Context context){
        context.getAssets().

        try {
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(getAssets().open("data.txt"), "UTF-8")); 

            StringBuilder builder = new StringBuilder();
            do {
                String mLine = reader.readLine();
                builder.append(mLine);
            } while (mLine != null) 


            reader.close();
            myData = builder.toString();
        } catch (IOException e) {
        }
    }   
 }

また、有効な Context参照を持つアプリケーション内の任意のクラスから:

String data = DataManager.getData(context);
于 2013-05-12T12:11:03.973 に答える