2015-08-29 2 views
1

Когда я удаляю строку requestQuery.add(), все работает отлично, за исключением отсутствия сетевых данных. После добавления requestQuery.add() - я получаю это:Почему возникает исключение OutOfMemory при вызове Volley.RequestQuery.add()?

Traceback:

08-29 18:15:53.071 6305-7075/? E/dalvikvm-heap﹕ Out of memory on a 840969348-byte allocation. 
    08-29 18:15:53.141 6305-7075/? E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-27227 
     java.lang.OutOfMemoryError 
       at com.android.volley.toolbox.DiskBasedCache.streamToBytes(DiskBasedCache.java:322) 
       at com.android.volley.toolbox.DiskBasedCache.readString(DiskBasedCache.java:540) 
       at com.android.volley.toolbox.DiskBasedCache.readStringStringMap(DiskBasedCache.java:562) 
       at com.android.volley.toolbox.DiskBasedCache$CacheHeader.readHeader(DiskBasedCache.java:403) 
       at com.android.volley.toolbox.DiskBasedCache.initialize(DiskBasedCache.java:156) 
       at com.android.volley.CacheDispatcher.run(CacheDispatcher.java:84) 

Вот код, у меня есть:

public class DataReceiver { 
    public static void initializeCountriesListUpdate(String urlString, final Context context) throws IOException { 
     RequestQueue requestQueue = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlString, 
       new Response.Listener<JSONObject>() { 
        @Override 
        public void onResponse(JSONObject response) { 
         try { 
          ArrayList<Country> countriesList = JsonParser.getCountriesFromJson(response, context); 

          ((CountriesListActivity)context).updateCountriesList(countriesList); 
          ((CountriesListActivity)context).progressDialog.hide(); 
          ((CountriesListActivity)context).progressDialog.dismiss(); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.e("NetworkManager", "Cannot resolve data from the server"); 
      } 
     }); 
     VolleySingleton.getInstance().getRequestQueue().add(jsonObjectRequest); 
    } 

UPD1:

Я попытался добавить

android:hardwareAccelerated="false" 
    android:largeHeap="true" 

Манифест, но это не помогло.

+0

Вы анализировали свою кучу свалки? – spiderman

+0

Моя проблема была в отсутствии кеша. Благодаря Udi для ссылки намек. Это руководство помогло мне сделать правильный синглтон: https://developer.android.com/training/volley/requestqueue.html#singleton –

ответ

1

Я подозреваю, ваш главный вопрос является исключением памяти, а также в качестве побочного эффекта вы получите исключение в отношении к ProgressDialog при попытке удалить точку зрения после того как вы» ve уже получил исключение OutOfMemoryError (это «просочилось» окно com.android.internal.policy.impl.PhoneWindow $ DecorView {41dbc578 VE .... R ...... D 0,0-684,192}, которое было первоначально добавленный здесь "часть).

Как основное исключение предполагает, что ваш кеш, вероятно, больше, чем куча, и ваши ответы с сервера достаточно велики, и вы должны сосредоточиться на устранении этой проблемы.

Я думаю, что этот question может помочь вам решить эту проблему.

0

Растровые изображения часто вызывают ошибку outofmemory. Попробуйте отказаться от загрузки растрового изображения, чтобы проверить, если это проблема. Проверьте там размер, и, возможно, использовать calculateInSampleSize, как описано здесь http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Смежные вопросы