我正在使用volley发送一些非常大的JsonRequest,当Json对象调用toString时,我收到一个java.lang.OutOfMemoryError。它位于Nexus 7 2013 Android 4.4
上JsonRequest request = new JsonRequest<ResponseData>(
method,
url,
EntryJsonObject.toString(),
responseListener,
errorListener)
java.lang.OutOfMemoryError
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132)
at java.lang.StringBuilder.append(StringBuilder.java:124)
at org.json.JSONStringer.string(JSONStringer.java:344)
at org.json.JSONStringer.value(JSONStringer.java:252)
at org.json.JSONArray.writeTo(JSONArray.java:602)
at org.json.JSONStringer.value(JSONStringer.java:233)
at org.json.JSONObject.writeTo(JSONObject.java:672)
at org.json.JSONObject.toString(JSONObject.java:641)
at com.dis.project1.restclient.Api.putInput(Api.java:205)
任何想法如何使用所有Json数据构建最终的String,以便我不会收到OutOfMemory。字符串大约有40 MB。这是一个有点复杂的结构,有3个JsonArrays和一些物体。
答案 0 :(得分:0)
你有没有试过压缩你的字符串?
伪代码:
byte[] compressedBytes = compress(bigJsonString);
String base64String = Base64.encode(compressedBytes );
[...]
byte[] origCompressedBytes = Base64.decode(base64String);
How can I easily compress and decompress Strings to/from byte arrays?
您也可以尝试Json Streaming
大多数应用程序应仅使用对象模型API。 JSON流媒体 在以下几种情况下很有用:
- 当无法或不希望加载整个对象模型时 进入记忆。这与内存的移动平台最相关 有限。
- 在需要之前阅读或写入文档时 完全可用。
答案 1 :(得分:-1)
只需在您的应用中添加 android:largeHeap =&#34; true&#34; 行 AndroidMenifest.xml。它可能会对你有帮助。
喜欢:
<application
android:name=""
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
**android:largeHeap="true"**
...
</application>