0

可能重复:
将大型 JSON (InputStream) 放入字符串时出现内存不足错误

我通过 HttpResponse 获取编码的 JSON 字符串。代码如下所示:

    BasicResponseHandler brh = new BasicResponseHandler(); 
    String responseString = brh.handleResponse(response); 
    String decoded = new String(Base64.decode(responseString, Base64.NO_CLOSE));

我收到这样的错误:

09-03 12:57:09.664: E/AndroidRuntime(8309): FATAL EXCEPTION: Thread-272
09-03 12:57:09.664: E/AndroidRuntime(8309): java.lang.OutOfMemoryError
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.CharArrayBuffer.<init>(CharArrayBuffer.java:43)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.ReadWriteCharArrayBuffer.<init>(ReadWriteCharArrayBuffer.java:47)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.CharBuffer.allocate(CharBuffer.java:54)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.charset.CharsetDecoder.allocateMore(CharsetDecoder.java:236)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:195)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.nio.charset.Charset.decode(Charset.java:487)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.lang.String.<init>(String.java:174)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at java.lang.String.<init>(String.java:141)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at xxx.DataManager.doPost(DataManager.java:448)
09-03 12:57:09.664: E/AndroidRuntime(8309):     at xxx.DataManager.run(DataManager.java:185)

有时我得到它

brh.handleResponse(response); 

有时在

String decoded = new String(Base64.decode(responseString, Base64.NO_CLOSE));

所以我认为字符串太大而无法处理(我不知道如何确定它的大小(以字节为单位)),我该如何解决这个问题?

4

1 回答 1

1

您应该切换到流式方法,其中只有最终的 JSON 数据结构完全保存在内存中。其他部分,特别是 JSON 编码的 HTTP 响应,是逐块处理的。所以它们只需要最少的内存。

这样你有几个优点:

  • 整体内存消耗大大减少。

  • 大分配的数量(对于大字符串)大大减少了。(有时有足够的可用内存,但没有足够大的一块分配一个大字符串。)

  • 由于解析可以在来自答案的第一个字节到达时立即开始,因此解析可以与数据接收并行进行。因此,应用程序变得更快。

org.json.JSONObject不支持流式传输。您将不得不使用不同的类。

顺便说一句:我看不出有任何理由为什么要使用 Base 64 编码 JSON 数据。JSON 是基于文本的格式,如果涉及二进制数据,则需要 Base 64 编码。

于 2012-09-03T13:18:45.587 回答