6

我的资产文件夹中存储了一个大约 1MB 的 JSON 文件,每次运行时都需要将其加载到我的应用程序中。我发现内置的 JSON 解析器 (org.json) 解析文件的速度非常慢,但是一旦解析完成,我就可以非常快速地访问和操作数据。从我点击应用程序到启动 Activity1 的那一刻,我计算了多达 7 或 8 秒,但从 Activity1 到 Activity2 只需几毫秒,这取决于从加载的数据处理的数据活动1。

我正在将文件读入内存并使用以下方法解析它:

String jsonString = readFileToMemory(myFilename)
JSONArray array = new JSONArray(jsonString);

其中 readFileToMemory(String) 看起来像这样:

private String readFileToMemory(String filename) {
    StringBuilder data = new StringBuilder();       
    BufferedReader reader = null;
    try {
        InputStream stream = myContext.getAssets().open(filename);
        reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
        int result = 0;
        do
        {
            char[] chunk = new char[512];
            result = reader.read(chunk);
            data.append(chunk);
        }
        while(result != -1);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data.toString();
}

有人对我如何加快数据的初始加载和解析有任何建议吗?我应该掩盖加载屏幕背后的整个过程吗?

4

2 回答 2

8

JSONObject-- 来自 json.org 的那个,是用于解析 JSON 的最简单的 API。然而,它带来了成本——性能。我对 JSONObject、Gson 和 Jackson 进行了广泛的实验。似乎无论您做什么,JSONObject(以及 JSONArray)都将是最慢的。请切换到 Jackson 或 Gson。

这是两者的相对表现

(最快)Jackson > Gson >> JSONObject(最慢)

参考:
-杰克逊
- Gson

于 2012-08-29T03:50:27.140 回答
2

您应该创建一个 SQLite 表来存储数据,并在应用程序第一次运行时将其从 JSON 移动到 SQL。作为一个额外的好处,这使数据更易于搜索,并使您可以从应用程序内修改数据。

于 2012-08-29T03:46:21.100 回答