Android Volley在JsonRequest中的字符串过大

时间:2015-03-15 21:42:26

标签: android json android-volley

我正在使用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和一些物体。

2 个答案:

答案 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>