Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to catch a out of memory Exception in AsyncTask

Tags:

java

android

http

My android application connect do an external database using a Web Service. In one case I have Enormous number of data, and I got out of memory exception:

09-09 20:05:59.441: ERROR/dalvikvm(4688): Out of memory: Heap Size=15751KB, Allocated=14962KB, Bitmap Size=687KB
09-09 20:05:59.451: WARN/dalvikvm(4688): threadid=23: thread exiting with uncaught exception (group=0x4001e390)
09-09 20:05:59.462: ERROR/AndroidRuntime(4688): Uncaught handler: thread AsyncTask #5 exiting due to uncaught exception
09-09 20:05:59.731: ERROR/AndroidRuntime(4688): java.lang.RuntimeException: An error occured while executing doInBackground()
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.Thread.run(Thread.java:1102)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688): Caused by: java.lang.OutOfMemoryError
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:97)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:142)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.lang.StringBuilder.append(StringBuilder.java:124)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextString(JSONTokener.java:252)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:316)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONObject.<init>(JSONObject.java:204)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONObject.<init>(JSONObject.java:204)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONTokener.nextValue(JSONTokener.java:319)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONArray.<init>(JSONArray.java:116)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at org.json.JSONArray.<init>(JSONArray.java:150)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.setTasks(ViewActivity.java:219)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.fetchTasks(ViewActivity.java:133)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity.access$9(ViewActivity.java:110)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:420)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at se.softwerk.timelog.activity.ViewActivity$LoadingDataFromServer.doInBackground(ViewActivity.java:1)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
09-09 20:05:59.731: ERROR/AndroidRuntime(4688):     ... 4 more

This is my class:

private class LoadingDataFromServer extends AsyncTask<Void, Void, Void> {

        @Override
        public void onPreExecute() {
            progress = ProgressDialog.show(ViewActivity.this, null,"Loading ...", true);
        }

        @Override
        protected void onPostExecute(Void result) {
            try {
                ListView lv = (ListView) main_activity.findViewById(R.id.listTask);
                lv.setAdapter(new TaskAdapter(main_activity));
                progress.dismiss();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                fetchTasks();
            } catch (Exception e) {      //DOES NOT WORK
                progress.dismiss();
                Toast.makeText(ViewActivity.this, "Enormous number of data, select smaller criteria", Toast.LENGTH_SHORT).show();
                finish();
            }
            return null;
        }
    }

How can I catch this Exception in doInBackground? My current trying does not work.

like image 557
Ali Avatar asked Nov 23 '25 03:11

Ali


2 Answers

OutOfmemoryError doesn't extends Exception, this is why you don't catch it.

This code should work.

try
{
    fetchTasks();       
}
catch(OutOfMemoryError e)
{
    // do something     
}
like image 126
florianmski Avatar answered Nov 24 '25 16:11

florianmski


try {
    ...
} catch (Exception e) {  // "catch all subclasses of java.lang.Exception"
    ...
}

However, OutOfMemoryError inherits from java.lang.Error and not java.lang.Exception and they both inherit from java.lang.Throwable. You can only throw instances of subclasses of java.lang.Throwable in java so you can catch any error or exception with this:

try {
    ...
} catch (Throwable t) {  // "catch all subclasses of java.lang.Throwable"
    ...
}
like image 40
main-- Avatar answered Nov 24 '25 17:11

main--



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!