1

我有离线 JSON 定义(在 assets 文件夹中)——我用它们创建了我的数据模型。它有 8 个类,它们都继承(扩展)一个抽象模型类。

如果我在应用程序的整个生命周期中解析 JSON 并将模型保存在内存中(或多或少都是整数或字符串),或者如果我根据需要解析 JSON 文件会更聪明吗?

谢谢

4

2 回答 2

3

解析文件并将所有数据存储在内存中肯定会给您带来速度优势。这种解决方案的问题在于,如果您的应用程序将进入后台(用户接听电话或只是按照自己的意愿离开应用程序),没有人可以保证数据会在内存中保持完整。

如果系统决定需要更多内存,则 GC 可以清除此数据。

这意味着,当用户返回应用程序时,如果您转述数据在内存中的事实,您可能会遇到异常。所以你需要考虑这种情况。

从那时起,最好将数据存储在可以在所需时间解析的文件中,即使这可能是一个较慢的解决方案。

您可能会看到的另一个解决方案是在第一次应用程序启动时将这些数据解析到 SQLite DB 并从那里使用它,或者甚至首先将其存储在 DB 中。这将为您提供两全其美的优势,您不必在使用之前解析数据,并且您可以使用 a 快速访问它,并且Cursor在内存不足的情况下您不会面临数据删除的问题系统。

于 2013-05-12T11:57:54.673 回答
1

我会一次读取所有文件内容并将其作为静态字符串保存在我的应用程序中的某个位置,该字符串可供所有应用程序组件(SingleTone Pattern)使用,因为通常在内存中维护一个小字符串比频繁打开和关闭文件便宜得多.

要解决@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) {
        }
    }   
 }

并且从应用程序中具有有效上下文引用的任何类中:

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