2012-09-09 3 views
2

내 안드로이드 응용 프로그램이 웹 서비스를 사용하여 외부 데이터베이스를 연결합니다. 한 경우에는 내가 데이터의 거대한 번호를 가지고, 나는 메모리 예외 중 을 가지고 :메모리 부족을 잡는 방법 AsyncTask의 예외

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 

이 내 클래스 :

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; 
     } 
    } 

가 어떻게 doInBackground에서이 예외를 잡을 수 있습니까? 현재 시도가 작동하지 않습니다.

+0

잡기 trowable 한 일을하지만 잭슨 – Selvin

+0

풀 파서 FX 중 하나를 사용하여이 오류를 방지 할 수 있습니다 http://stackoverflow.com/questions/2679330/catching-java-lang-outofmemoryerror – Raedwald

답변

6

OutOfmemoryError 예외를 확장하지 않으므로이를 포착하지 않습니다.

이 코드는 작동합니다.

try 
{ 
    fetchTasks();  
} 
catch(OutOfMemoryError e) 
{ 
    // do something  
} 
+0

또는 "Throwable"을 잡을 수 있습니다. 그러나이 오류 상황을 처리하기위한 적절한 방법인지 궁금합니다. 도움을 청하려면 – harism

+0

+1. – Ali

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

그러나 OutOfMemoryErrorjava.lang.Error에서 상속하지 java.lang.Exception하고는 모두 java.lang.Throwable에서 상속합니다. 할 수 있습니다 자바 java.lang.Throwable의 서브 클래스의 throw 경우이와 어떤 오류 또는 예외를 잡을 수 있도록 :

try { 
    ... 
} catch (Throwable t) { // "catch all subclasses of java.lang.Throwable" 
    ... 
} 
+0

알아두면 좋지만 내 실수는 아니 었습니다. 내 대답을 확인해주세요. 당신이 어떤 생각을 가지고 있다면, 나는 그것을들을 수있게되어서 고맙습니다. 귀하의 도움을 위해 – Ali

+0

+1. – Ali

관련 문제