kevinsawicki / http-request

Java HTTP Request Library
http://kevinsawicki.github.io/http-request
MIT License
3.36k stars 843 forks source link

java.lang.OutOfMemoryError in java.lang.String.<init> when downloading json files #77

Open holoduke opened 10 years ago

holoduke commented 10 years ago

Some of my users are reporting out of memory errors. Is there a way to optimize the method ByteArrayOutputStream?

stack trace:

java.lang.RuntimeException: An error occured while executing doInBackground() at android.os.AsyncTask$3.done(AsyncTask.java:299) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) at java.util.concurrent.FutureTask.setException(FutureTask.java:219) at java.util.concurrent.FutureTask.run(FutureTask.java:239) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:856) Caused by: java.lang.OutOfMemoryError at java.lang.String.(String.java:255) at java.lang.String.(String.java:213) at java.io.ByteArrayOutputStream.toString(ByteArrayOutputStream.java:175) at com.github.kevinsawicki.http.HttpRequest.body(HttpRequest.java:1714) at com.github.kevinsawicki.http.HttpRequest.body(HttpRequest.java:1728) at loader.JSONAsyncCachedLoader$1.doInBackground(JSONAsyncCachedLoader.java:66) at loader.JSONAsyncCachedLoader$1.doInBackground(JSONAsyncCachedLoader.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask.run(FutureTask.java:234)

kevinsawicki commented 10 years ago

Perhaps try using stream()/reader() instead, what JSON library are you using?

It probably supports streaming using a InputStreamReader and/or InputStream instead of parsing one big String.

holoduke commented 10 years ago

i am using Android's copy of JSONTokener Seems to be no way to insert a stream in that jsontokener lib. Only strings.

kevinsawicki commented 10 years ago

I think you might workaround this by using JsonReader from the Gson library.

MateuszMlodawski commented 10 years ago

The body(final String charset) method returns a String object so this can throw OOM exception I think. Have the same issue btw.