调用Volley.RequestQuery.add()时为什么会出现OutOfMemory异常?

时间:2015-08-29 12:32:57

标签: android android-volley

当我删除requestQuery.add()行时 - 除了缺少网络数据外,一切正常。添加requestQuery.add()后 - 我得到了这个:

回溯:

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"

到Manifest,但它没有帮助。

2 个答案:

答案 0 :(得分:1)

我怀疑你的主要问题是内存异常,作为一个副作用,你在获得OutOfMemoryError异常后尝试删除视图时得到有关ProgressDialog的异常(这是“已泄漏的窗口com” .android.internal.policy.impl.PhoneWindow $ DecorView {41dbc578 VE .... R ...... D 0,0-684,192}最初添加到这里“部分”。

由于主要的Exception建议您的缓存可能比堆大,而且您的服务器响应非常大,您应该专注于重新解决此问题。

我认为此question可能会帮助您解决此问题。

答案 1 :(得分:0)

位图通常会导致内存错误。 尝试省略位图加载以测试是否存在问题。 检查大小,并可以使用此处所述的calculateInSampleSize http://developer.android.com/training/displaying-bitmaps/load-bitmap.html