2015-07-15 7 views
-1

Я продолжаю получать эту ошибку при запуске приложения. Приложение будет хорошо компилироваться, и взаимодействие с приложением будет нормальным, и до определенного периода времени он выйдет с сообщением об ошибке OUTOFMEMORY.FATAL EXCEPTION: main java.lang.OutOfMemoryError

Ошибка Logcat:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.OutOfMemoryError 
     at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94) 
     at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145) 
     at java.lang.StringBuilder.append(StringBuilder.java:216) 
     at org.json.JSONStringer.value(JSONStringer.java:249) 
     at org.json.JSONArray.writeTo(JSONArray.java:572) 
     at org.json.JSONStringer.value(JSONStringer.java:233) 
     at org.json.JSONObject.writeTo(JSONObject.java:671) 
     at org.json.JSONObject.toString(JSONObject.java:640) 
     at com.android.volley.toolbox.JsonObjectRequest.<init>(JsonObjectRequest.java:47) 
     at com.apps.robotapp.RobotService.onStart(RobotService.java:75) 
     at android.app.Service.onStartCommand(Service.java:450) 
     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2833) 
     at android.app.ActivityThread.access$2000(ActivityThread.java:159) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1419) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5419) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
     at dalvik.system.NativeStart.main(Native Method) 

В Java: 75 (RobotService: OnStart), где происходит ошибка:

RequestQueue queue = Volley.newRequestQueue(this);  
JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST,SPHERE_URL,obj, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        //System.out.println("JsonObjectRequest:>>" + response + "<<"); 
        System.out.println(response); 
        //hideProgressDialog(); 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //hideProgressDialog(); 
        Runtime.getRuntime().gc(); 
       } 
      }); queue.add(jsObjRequest); 

Я реализовал как System.gc() и Runtime.getRuntime() .gc() в мою реализацию, однако она по-прежнему не работает.

Любая идея, как я могу решить эту проблему? Thanks

+0

Какая линия исходит от линии 75? – TDG

+1

Вызов GC недостаточен, если вы все еще поддерживаете ссылки вокруг. В качестве примера я вижу, что вы используете для вызова 'queue.add' для каждого объекта. Вы также заботитесь о том, чтобы выскочить из этой очереди или расти без контроля? – skypjack

+0

@TDG Это строка 75: 'JsonObjectRequest jsObjRequest = новый JsonObjectRequest (Request.Method.POST, SPHERE_URL, OBJ, новый Response.Listener ()' – developer

ответ

0

Помимо использования чрезмерных объемов памяти, это может произойти, когда вы утечка памяти. Утечка непреднамеренно ведет ссылки на объекты, которые вам больше не нужны.

Существует много способов, которыми это может случиться. Самый очевидный - никогда не очищать старые элементы из кеша. В Android у вас может быть Context related memory leaks, но это может быть не так.

Посмотрите на Google I/O 2011: Memory Management for Android Apps для курса крушения по памяти. В видео есть ссылка на инструмент анализа памяти Eclipse (MAT), который поможет вам увеличить масштаб проблемы. Освоение этого, скорее всего, займет довольно много времени, поэтому вы можете просто посмотреть видео, чтобы понять, что происходит с утечками памяти, а затем, используя свой здравый смысл и знания вашего приложения, обнаружите утечку из соображений. Удачи!