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

Android:Volley JsonRequest将整个对象保留在内存中,android,memory-leaks,android-volley,Android,Memory Leaks,Android Volley,我正在使用截取从URL获取JsonObject。我的问题是,我经常会遇到OutOfMemory异常。我用MAT分析内存泄漏,我看到整个对象在下载和使用后仍在内存中。我做错了什么 截击码 JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

我正在使用截取从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);
JsonObjectRequest JSONObjectReq=新的JsonObjectRequest(Request.Method.GET,
url,空,
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
item=parser.parse(响应);
updateLayout();
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
bar.setVisibility(View.GONE);
如果(!isNetworkAvailable()){
Toast.makeText(行为,“无互联网连接”,Toast.LENGTH_SHORT.show();
}
否则{
Toast.makeText(表示“服务器已关闭,请重试)”,Toast.LENGTH_SHORT.show();
}
}
});
//将请求添加到请求队列
getInstance().addToRequestQueue(JSONOBJEQ);
MAT屏幕截图


好的,我想你的问题在这里:

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

更新:


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


退出响应块{}后,最后一个大括号将自动从内存中删除响应,所以不要担心您的响应。我认为你的问题与截击警车或这个图书馆的任何其他东西无关。我认为您必须检查应用程序的其他方面,如解析json的方法或…

在完成我的应用程序泄漏搜索后,我终于明白为什么volley会将请求保留在内存中。在我的例子中,我使用截击单例模式。Volley有4个线程进行网络调度,每个线程保留一个请求

当您执行4次以上的请求时,内存中将始终保留4个请求。如果没有其他泄漏问题,请求将不会提出。 通常,我们使用新的匿名内部类请求,这将保持对外部类的强引用。因此,我们将在onDestory()之后看到活动而不是GC

所以,截击并没有大问题,若你们不想请求保持对你们的类的强引用,那个么使用weakReference。
您的OOM问题一定是由其他原因造成的。

您的意思是这3个项目显示在内存中,而volley没有删除它们吗?是的。onResponse完成后,json中的对象(3个项目所在的位置)不会被删除,并且在剩余的活动中仍保留在内存中。很抱歉,我是这方面的新手,我不完全理解您的意思。。。你能解释一下吗?我得试试截击的另一个球?我想在onResponse之后释放内存,这样Json中的对象的HashMap使它不再处于活动状态。我的意思是,这些HashMap不是内存泄漏,这些是您对服务器的其他请求,您没有在映像中指定任何内存泄漏。您可以将异常OOM logcat发布到Stackoverflow,有很多专业的开发人员可以很容易地帮助你。。我了解截击网络的实现。但是,如果我们的请求需要200万个响应(例如)呢?我有一个活动在其onCreate上触发请求。我已经试过打开和关闭它很多次了。过了一会儿,截击导致了OOM。@Edoardotogoni请在stackoverflow上问一下,因为我不知道你到底有什么问题?同时发布logcat和您的代码,我或其他人可能会帮助您:-)Volley已修复泄漏问题,请检查这里