4

我正在使用以下代码解析从 Web 获取的 JSON 字符串(30,000 条记录)

DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httppost = new HttpPost(params[0]);
        httppost.setHeader("Content-type", "application/json");
        InputStream inputStream = null;
        String result = null;
        HttpResponse response = null;
        try {
            response = httpclient.execute(httppost);

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }           
        HttpEntity entity = response.getEntity();
        try {
            inputStream = entity.getContent();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),8);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            while ((line = reader.readLine()) != null)  
            {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        result = sb.toString();

我在下面的代码中收到 OutofMemory 错误

while ((line = reader.readLine()) != null)  
{
    sb.append(line + "\n");
}

如何摆脱此错误。当 json 字符串非常庞大时,确实会发生此错误,因为它包含大约 30,000 条记录的数据。

非常感谢这方面的任何帮助..

4

4 回答 4

3

Android 对每个应用程序都施加了内存上限(几乎所有手机都为 16 MB,一些较新的平板电脑有更多)。应用程序应确保将其实时内存限制保持在该级别以下。

所以我们有时不能完全保存一个大字符串,比如超过 1MB,因为应用程序的总实时内存使用量可能超过该限制。请记住,总内存使用量包括我们在应用程序中分配的所有对象(包括 UI 元素)。

因此,您唯一的解决方案是使用 Streaming JSON 解析器,它可以接收数据。也就是说,您不应该在 String 对象中保留完整的字符串。一种选择是使用Jackson JSON parser

编辑:Android 现在从 API 级别 11 支持JSONReader。从未使用过它,但它似乎是要走的路..

于 2012-11-01T11:45:55.410 回答
1

如果数据文件太大,您无法将其全部读取到内存中。

读取一行,然后将其写入本机文件。不要使用 StringBuilder 将所有数据保存在内存中。

于 2012-11-01T11:43:33.953 回答
0

我用这个库解决了这个问题。这里有一个很好的教程。

有了这个,您将绕过将 entity.getContent() 转换为 String ,这将解决您的问题。

InputStream inputStream = entity.getContent();
JsonReader reader = Json.createReader(inputStream);
JsonObject jsonObject = reader.readObject();
return jsonObject;
于 2014-09-02T09:18:55.957 回答
0

尝试以大块的形式导入数据,例如每次 1000 条记录。希望您不会遇到此问题。

于 2012-11-01T11:45:17.267 回答