Android: Out of Memory Fehler StringBuilder

In meine app, die ich abrufen der Daten vom server in form von JSON. Die Daten ist rund 1,5 MB. Die app funktioniert, aber manchmal stürzt es beim abrufen von Daten vom server geben OutOfMemoryError.

Dies ist meine Methode:

private String sendPostRequest(String url, List<NameValuePair> params)
        throws Exception {
    String ret = null;

    BufferedReader bufferedReader = null;
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost request = new HttpPost(url);

    try {
        UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
        request.setEntity(entity);

        HttpResponse response = httpClient.execute(request);

        bufferedReader = new BufferedReader(new InputStreamReader(response
                .getEntity().getContent()));
        StringBuilder stringBuilder = new StringBuilder("");
        StringBuilder stringBuilder2;
        String line = "";
        //String LineSeparator = System.getProperty("line.separator");
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
        bufferedReader.close();

        ret = stringBuilder.toString();
        stringBuilder = null;

    } catch (ClientProtocolException e) {
        e.printStackTrace();
        //TODO: report an error
    } catch (IOException e) {
        e.printStackTrace();
        //TODO: report an error
    } finally {
        if (bufferedReader != null) {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                e.printStackTrace();
                //TODO Auto-generated catch block
            }
        }
    }
    return ret;
}

Ich habe versucht, das StringBuilder-Objekt auf null nach Gebrauch aber hat nicht geholfen.
Ich bin Entsendung der logcat Spuren unten:

10-23 03:39:25.271: E/dalvikvm-heap(1011): Out of memory on a 4116282-byte allocation.
10-23 03:39:25.271: I/dalvikvm(1011): "AsyncTask #1" prio=5 tid=11 RUNNABLE
10-23 03:39:25.271: I/dalvikvm(1011):   | group="main" sCount=0 dsCount=0 obj=0x417c5e88 self=0x2a1d1db8
10-23 03:39:25.271: I/dalvikvm(1011):   | sysTid=1025 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=706552328
10-23 03:39:25.271: I/dalvikvm(1011):   | state=R schedstat=( 3053328788 23773807212 6541 ) utm=241 stm=64 core=0
10-23 03:39:25.271: I/dalvikvm(1011):   at java.lang.String.<init>(String.java:~422)
10-23 03:39:25.271: I/dalvikvm(1011):   at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642)
10-23 03:39:25.282: I/dalvikvm(1011):   at java.lang.StringBuilder.toString(StringBuilder.java:663)
10-23 03:39:25.282: I/dalvikvm(1011):   at com.dzo.dispatchcrude.driverapp.datalayer.ServerConnect.sendPostRequest(ServerConnect.java:128)
10-23 03:39:25.282: I/dalvikvm(1011):   at com.dzo.dispatchcrude.driverapp.datalayer.ServerConnect.Sync(ServerConnect.java:61)
10-23 03:39:25.282: I/dalvikvm(1011):   at com.dzo.dispatchcrude.driverapp.datalayer.DBSync.Login(DBSync.java:59)
10-23 03:39:25.282: I/dalvikvm(1011):   at com.dzo.dispatchcrude.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:52)
10-23 03:39:25.282: I/dalvikvm(1011):   at com.dzo.dispatchcrude.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:1)
10-23 03:39:25.282: I/dalvikvm(1011):   at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-23 03:39:25.282: I/dalvikvm(1011):   at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-23 03:39:25.282: I/dalvikvm(1011):   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-23 03:39:25.282: I/dalvikvm(1011):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-23 03:39:25.282: I/dalvikvm(1011):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-23 03:39:25.282: I/dalvikvm(1011):   at java.lang.Thread.run(Thread.java:841)
10-23 03:39:25.282: W/dalvikvm(1011): threadid=11: thread exiting with uncaught exception (group=0x41465700)
10-23 03:39:25.292: I/Choreographer(1011): Skipped 30 frames!  The application may be doing too much work on its main thread.
10-23 03:39:25.491: E/AndroidRuntime(1011): FATAL EXCEPTION: AsyncTask #1
10-23 03:39:25.491: E/AndroidRuntime(1011): java.lang.RuntimeException: An error occured while executing doInBackground()
10-23 03:39:25.491: E/AndroidRuntime(1011):     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.FutureTask.run(FutureTask.java:239)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.lang.Thread.run(Thread.java:841)
10-23 03:39:25.491: E/AndroidRuntime(1011): Caused by: java.lang.OutOfMemoryError
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.lang.String.<init>(String.java:422)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.lang.StringBuilder.toString(StringBuilder.java:663)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at com.dzo.dispatchcrude.driverapp.datalayer.ServerConnect.sendPostRequest(ServerConnect.java:128)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at com.dzo.dispatchcrude.driverapp.datalayer.ServerConnect.Sync(ServerConnect.java:61)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at com.dzo.dispatchcrude.driverapp.datalayer.DBSync.Login(DBSync.java:59)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at com.dzo.dispatchcrude.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:52)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at com.dzo.dispatchcrude.driverapp.asynctask.SyncDBTask.doInBackground(SyncDBTask.java:1)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-23 03:39:25.491: E/AndroidRuntime(1011):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
10-23 03:39:25.491: E/AndroidRuntime(1011):     ... 4 more
10-23 03:39:28.091: E/WindowManager(1011): Activity com.dzo.dispatchcrude.driverapp.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4178fcb0 V.E..... R.....ID 0,0-479,96} that was originally added here
10-23 03:39:28.091: E/WindowManager(1011): android.view.WindowLeaked: Activity com.dzo.dispatchcrude.driverapp.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{4178fcb0 V.E..... R.....ID 0,0-479,96} that was originally added here
10-23 03:39:28.091: E/WindowManager(1011):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
10-23 03:39:28.091: E/WindowManager(1011):  at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
10-23 03:39:28.091: E/WindowManager(1011):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
10-23 03:39:28.091: E/WindowManager(1011):  at android.app.Dialog.show(Dialog.java:281)
10-23 03:39:28.091: E/WindowManager(1011):  at com.dzo.dispatchcrude.driverapp.asynctask.SyncDBTask.onPreExecute(SyncDBTask.java:43)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.AsyncTask.execute(AsyncTask.java:534)
10-23 03:39:28.091: E/WindowManager(1011):  at com.dzo.dispatchcrude.driverapp.asynctask.LoginAsyncTask.onPostExecute(LoginAsyncTask.java:87)
10-23 03:39:28.091: E/WindowManager(1011):  at com.dzo.dispatchcrude.driverapp.asynctask.LoginAsyncTask.onPostExecute(LoginAsyncTask.java:1)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.AsyncTask.finish(AsyncTask.java:631)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-23 03:39:28.091: E/WindowManager(1011):  at android.os.Looper.loop(Looper.java:137)
10-23 03:39:28.091: E/WindowManager(1011):  at android.app.ActivityThread.main(ActivityThread.java:5103)
10-23 03:39:28.091: E/WindowManager(1011):  at java.lang.reflect.Method.invokeNative(Native Method)
10-23 03:39:28.091: E/WindowManager(1011):  at java.lang.reflect.Method.invoke(Method.java:525)
10-23 03:39:28.091: E/WindowManager(1011):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-23 03:39:28.091: E/WindowManager(1011):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-23 03:39:28.091: E/WindowManager(1011):  at dalvik.system.NativeStart.main(Native Method)
10-23 03:44:25.761: I/Process(1011): Sending signal. PID: 1011 SIG: 9

Update 1

Versuchte ich mit diesem Ansatz wieder gab es Fehler mit toString()in meinem Fall auch, es gibt Fehler mit toString(). Das gleiche passiert, während ich versuchte mit Amit ' s Antwort. Gibt es etwas, mit toString().

Update 2

Entfernt, Schaffung neuer String builder Objekt aus while-Schleife und jetzt bin ich nicht mit line separator. Aber, es hat nicht viel Unterschied. Die app läuft für die erste Zeit. Aber, wenn ich versuche zu laufen und 2-3 mal das selbe problem wieder Auftritt.

  • Vielleicht [diesem][1] lösen Ihr Problem. [1]: stackoverflow.com/questions/8359693/...
  • Danke, aber die app läuft auf Smartphones und tablets, so kann ich nicht erhöhen heap-Größe von einem Handy
InformationsquelleAutor Nitish | 2013-10-23
Schreibe einen Kommentar