Android:Volley JsonRequest将整个对象保留在内存中

时间:2014-08-14 08:18:47

标签: android memory-leaks android-volley

我正在使用volley从URL获取JsonObject。我的问题是我常常遇到OutOfMemory异常。我曾经使用MAT来分析内存泄漏,我看到下载和使用它后响应的整个对象仍然在内存中。我做错了什么?

排球代码

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
            url, null,
            new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    item = parser.parse(response);
                    updateLayout();

                }
            }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            bar.setVisibility(View.GONE);
            if(!isNetworkAvailable()){
                Toast.makeText(act, "No Internet Connection.", Toast.LENGTH_SHORT).show();
            }
            else{
                Toast.makeText(act, "The Server Is Down. Try Again.", Toast.LENGTH_SHORT).show();
            }
        }
    });

    // Adding request to request queue
    VolleySingleton.getInstance().addToRequestQueue(jsonObjReq);

MAT截图

enter image description here

2 个答案:

答案 0 :(得分:2)

好的我认为你的问题在这里:

网络调度程序是一个线程,他的职责是将请求发送到服务器并获得结果,他管理http连接,他是你的外部接口,所以这个线程中的每个对象都是他们的请求在飞行中的人并且已经发送到服务器并等待返回结果,这些是其他请求,而不是您在响应时获得结果的请求。网络响应是管理解析响应并在响应传递给网络调度程序后将其传递给您的响应。我建议你看一下源代码,以便更好地理解这个漂亮的框架。我认为你的问题是通过解析器或你的长json来解决的,所以你可以通过为volley或其他joson解析器技术提供更大的缓存来消除它。

更新

我的意思是那些哈希映射不是内存泄漏,那些是你对服务器的其他请求,你没有在图像中指定任何内存泄漏。你在照片上显示的是你发送给齐射的其他请求。当您将请求发送到此库时,此库会创建与服务器的多个请求连接,以使您的网络操作快速。这些多个请求需要一段时间才能从您的设备转到服务器并返回响应。这些请求和连接都由网络调度员管理。它建立多个连接并向服务器发送请求。所以你在图像上看到的是那些尚未从服务器获得结果的请求。所以这3个项目必须进入内存,因为那些是你想要结果的请求。

退出响应块{} imean last brace后,您的响应会自动从内存中删除,因此请不要担心您的响应。我认为你的问题与排球或这个图书馆的其他任何事情无关。我认为你必须检查你的应用程序的其他方面,如解析json的方法或...

答案 1 :(得分:1)

在完成我的应用程序泄漏搜索后,我终于理解为什么凌空将请求保留在内存中。在我的情况下,我使用凌空单身模式。 Volley有4个线程进行网络调度,每个线程都会保留一个请求。

当您执行超过4次请求时,将始终有4个请求保留在内存中。没有其他泄漏问题,请求不会提出。 通常,我们使用新的匿名内部类请求,它将保留对外部类的强引用。所以我们会在onDestory()之后看到Activity not GC。

因此,Volley没有大问题,如果你不想要请求保持对你的类的强引用,那么使用weakReference。 您的OOM问题必定是其他原因造成的。