齐射请求的匿名侦听器导致内存泄漏

2023-11-23

我正在使用 volley 库进行网络服务调用。我创建了一个通用类来进行所有 Web 服务调用并从那里进行服务调用,并为成功和错误响应创建了匿名侦听器。

但是当我使用泄漏金丝雀时,它显示与上下文相关的内存泄漏。下面是我的代码片段:

public void sendRequest(final int url, final Context context, final ResponseListener responseListener, final Map<String, String> params) {
    StringRequest stringRequest;
    if (isNetworkAvailable(context)) {

      stringRequest = new StringRequest(methodType, actualURL + appendUrl, new Listener<String>() {
            @Override
            public void onResponse(String response) {
                dismissProgressDialog(context);
                try {
                    (responseListener).onResponse(url, response);
                } catch (JsonSyntaxException e) {
                    // Util.showToast(context, context.getResources().getString(R.string.error));
                    Crashlytics.logException(e);
                }
            }

        }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // Util.showToast(context,context.getString(R.string.error));

                dismissProgressDialog(context);
                if (error instanceof NetworkError) {
                     Util.showToast(context, context.getResources().getString(R.string.network_error));
                } else if (error instanceof NoConnectionError) {
                     Util.showToast(context, context.getResources().getString(R.string.server_error));
                } else if (error instanceof TimeoutError) {
                     Util.showToast(context, context.getResources().getString(R.string.timeout_error));
                } else {
                     Util.showToast(context, context.getResources().getString(R.string.default_error));
                }


            }

        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }


            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                return request.getHeaders(context, actualURL, false);
            }
        };
        stringRequest.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        VolleySingleton.getInstance(context).addRequest(stringRequest);
    } else {
         Util.showToast(context, context.getString(R.string.internet_error_message));
    }
}

我创建了一个名为响应侦听器的接口,用于将响应重定向到活动或片段。我提出了如下请求。

Request.getRequest().sendRequest(Request.SOME URL, SplashScreenActivity.this, SplashScreenActivity.this, new HashMap<String, String>());

但我面临内存泄漏:

In 2.1.1:31.
* activity.SplashScreenActivity has leaked:
* GC ROOT com.android.volley.NetworkDispatcher.<Java Local>
* references network.Request$5.mListener (anonymous subclass of com.android.volley.toolbox.StringRequest)
* references network.Request$3.val$responseListener (anonymous implementation of com.android.volley.Response$Listener)
* leaks activity.SplashScreenActivity instance
* Retaining: 1.2MB.
* Reference Key: b8e318ea-448c-454d-9698-6f2d1afede1e
* Device: samsung samsung SM-G355H kanas3gxx
* Android Version: 4.4.2 API: 19 LeakCanary: 1.4 6b04880
* Durations: watch=5052ms, gc=449ms, heap dump=2617ms, analysis=143058ms

任何消除此泄漏的想法任何帮助都是值得赞赏的。


通常,匿名类对封闭类实例具有强引用。在你的例子中,这就是 SplashScreenActivity。现在我猜,你的Activity在您通过 Volley 从服务器收到响应之前就已完成。由于侦听器对封闭的 Activity 具有强引用,因此在 Anonymous 类完成之前无法对该 Activity 进行垃圾回收。您应该做的是用 Activity 实例标记您发送的所有请求,并取消所有请求onDestroy()Activity 的回调。

stringRequest.setTag(activityInstance);

要取消所有待处理的请求:

requestQueue.cancellAll(activityInstance);

另外,使用 VolleySingleton 内的应用程序上下文来创建 RequestQueue。

mRequestQueue = Volley.newRequestQueue(applicationContext);

不要在那里使用您的 Activity 上下文,也不要将您的 Activity 实例缓存在 VolleySingleton 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

齐射请求的匿名侦听器导致内存泄漏 的相关文章

  • 从SQLite列中获取所有数字字符串并进行总和计算

    我是 Android 和 SQLite 的新手 我在 SQLite 中有一个只有数字的 AMOUNT 列 我可以在 ListView 中显示它 但我无法找到任何我理解的方法来将它们全部添加并显示在 TextView 中 这是数据库助手 im
  • 如何构建 Perl Web 服务基础设施

    我有许多用于管理多服务器基础设施的脚本 其中一些脚本需要 root 访问权限 一些需要访问数据库 并且大多数脚本都是基于 perl 的 我想将所有这些脚本转换为非常简单的 Web 服务 可以从不同的应用程序执行 这些 Web 服务将接受常规
  • 使用 Android NDK r5b 链接静态库时出现问题 [重复]

    这个问题在这里已经有答案了 最近升级到 NDK r5b 构建失败 并出现对静态库中函数的 未定义引用 这是错误 home brian workspace VoiceEngineDemo obj local armeabi v7a objs
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • 如何在android中以编程方式自动执行触摸

    我有一个RelativeLayout我想在不触摸屏幕的情况下执行触摸事件想要给出Toast如果它确实被触摸或没有被触摸 请抛出消息 我已经尝试过下面的方法 但它似乎不起作用 MotionEvent event MotionEvent obt
  • 有没有办法获取 Android 扩展文件中特定文件的 Url?

    我正在构建一个 PhoneGap 应用程序 其中包含大型音频和视频文件 在 Android 中 媒体文件应位于扩展文件中 以使应用程序大小保持在 Google Play 50 MB 限制以下 我目前正在考虑两种播放视频文件的方法 将所需的视
  • 我从 String placeName = placeText.getText().toString(); 收到空指针异常

    您好 想从编辑文本中获取地名并在地图上标记 这是我的代码 其中出现空指针异常 请帮助我应该做什么以及哪里出错了 因为我从对话框中的编辑文本字段获取地名 View layout View inflate this R layout alert
  • 每当调用 startactivityforresult 时 Android 就会终止我的应用程序

    好吧 在我的应用程序中 我使用 Android 的默认相机和图库 startActivityforResult 为 Intent i new Intent android intent action PICK MediaStore Imag
  • Android 闹钟应用程序在 Oreo 下因 NullPointerException 导致 SystemUI 崩溃(仅限)

    我有一个 Android 闹钟应用程序 我有通常的 警报意图 gt 接收器 gt 活动链 其最后一步创建一个全屏窗口并发出警报 所有这些在 Oreo API 26 之前的 Android 版本上都可以正常工作 但在 Oreo 上 当警报触发
  • Android:如何在双 SIM 卡手机中获取两张 SIM 卡的 SIM ID

    我想获取双 SIM 卡手机中两个 SIM 卡的 SIM 序列号 ID 有什么方法可以获取它们吗 提前致谢 import java lang reflect Method import android content Context impo
  • TabHost 中的 Webview = 以黑屏启动

    我正在尝试在有 4 个选项卡的 tabhost 中使用 webview 所有选项卡都链接到同一个 webview 这很好 除了一个问题 启动时 网络视图是黑色的 单击选项卡 2 3 或 4 使其 活跃起来 我的快速解决方法是使用 setCu
  • Android 生命周期哪个事件在生命周期中只触发一次?

    我读过一些博客并访问了一些网站 我想知道哪个事件在生命周期中只触发了一次 阅读博客后我意识到onCreate 方法在生命周期内仅触发一次 我不知道我是对还是错 现在我的问题是 我想触发任何仅在我更改横向或纵向方向时触发一次的事件 而不是在启
  • 在 Android 运行时更改和应用主题 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Android 运行时更改当前主题 https stackoverflow com questions 2482848 how to change current theme at runti
  • Gradle创建多项目Jar

    因此 从 Gradle 和 Android Studio 诞生之初起 我就一直在使用它们 然而 我发现自己用头撞墙的次数有时远远超过了它的价值 我花了一天半的时间试图解决我目前的困境 在我工作的地方 我们使用很多共享库项目 这意味着与 Gr
  • Android wifi的信号强度[重复]

    这个问题在这里已经有答案了 可能的重复 Android 如何监控WiFi信号强度 https stackoverflow com questions 1206891 android how to monitor wifi signal st
  • 如何修补更新 Android Studio (0.80 -> 0.81)?

    我安装了 Android Studio Beta v0 8 0 并下载了 v0 8 1 因为 IDE 不会自动下载 v0 80 并使用新版本修补 Android Studio 的预览系列自动做到了这一点 从他们的网页 http tools
  • 是否可以在本机代码中读取/编辑共享首选项?

    我有一个 Android 应用程序 其中包含一个使用 NDK 执行一些代码的 C 库 在 C 库中 我想更新应用程序共享首选项 我的问题 是否可以在本机代码中读取 编辑共享首选项 您可以在本机代码中做任何您想做的事情 这只是很麻烦 您需要
  • Android 上的 Facebook 深度链接

    我正在尝试在我的应用程序上实现 Facebook 的深度链接功能 并遇到了以下情况 我有一个名为 MainActivity 的活动 其声明如下
  • 新的 Android 项目未创建布局或 Java 文件

    这两天我一直在尝试简单地阅读 Big Nerd Ranch Android 编程书 第一章的前几页 我的问题的要点是 当我创建新的 Android 应用程序时 不会创建布局或 java 文件 我已经从 Android 开发站点安装了 ADT
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie

随机推荐

  • 如何在 readthedocs 上记录 cython 函数

    On 阅读文档我不被允许编译cython扩展 是否可以配置sphinx为了从中提取文档字符串cython文件而不实际编译它们 thanks 我遇到了同样的问题 发现现在可以在 readthedocs 上编译 Cython 扩展 简短回答 可
  • “__cplusplus”宏扩展为什么?

    C 宏有什么作用 cplusplus包含并扩展到 有没有宏 cplusplus即使在最古老的 C 实现中 也始终包含并扩展为numeric value 使用安全吗 if cplusplus或者我们应该用它来代替 ifdef cplusplu
  • Mac 开发的 PyObjc 与 RubyCocoa:哪个更成熟?

    我一直想尝试一下 Ruby 或 Python 同时我也一直想做一些 Cocoa 编程 因此 我认为实现这两个目标的最佳方法是使用 Ruby 或 Python 到 Objective C 的桥梁 PyObjc 或 RubyCocoa 来开发一
  • Quartz Scheduler 关闭后不停止

    我在 jboss 4 0 5 上使用当前最新的quartz 1 8 3 石英作业是持久的并保存到本地数据库中 当我在执行的石英调度程序对象上调用 shutdown 或standby 方法时 作业仍然由调度程序继续执行 只是作业状态为空并且执
  • 状态 Property 中的令牌 PropertyName 将导致无效的 JSON 对象。使用自定义 JsonConverter

    我正在尝试使用 Json NET 和自定义序列化程序序列化 反序列化 NET 数据集 我知道你们中的许多人会告诉我不要这样做 我在其他帖子上看到过这一点 我有充分的理由并希望继续沿着这条路走 我的序列化基于以下事实 NET DataSet
  • 获取 Django url 模板标签中 javascript 变量的值

    众所周知 有一种通过使用 django 模板标签 url 定向到 URL 的 DRY 方式 例如 url someview arg1 X 在这里 我希望 X 是 JavaScript 变量的值 例如tmp 但以下不起作用 我应该如何获取模板
  • 使用 AutoMapper 映射未知类型

    我在用着AutoMapper将一个对象的属性复制到另一个对象 这是我的代码 Get type and create first object Type itemType Type GetType itemTypeName var item
  • Android 6.0 Adb wifi 连接

    我有一台装有 Android 6 0 的 Nexus 6 设备 库存版本无需 root 为了避免用 USB 电缆永久连接设备 我使用了这个程序 我通过 USB 电缆将设备连接到 PC 在终端上输入adb tcpip 5555 type ad
  • 以字符串形式返回 Matplotlib 图像

    我在 django 应用程序中使用 matplotlib 想直接返回渲染的图像 到目前为止我可以走plt savefig 然后返回图像的位置 我想做的是 return HttpResponse plt renderfig mimetype
  • 使用正则表达式 re.sub 删除指定单词之前的所有内容(包括指定单词)

    我有一个字符串 看起来像 Blah blah blah 更新 2012 年 8 月 23 日 我想使用正则表达式从中提取日期Aug 23 2012 我在书库里找到一篇文章 内容类似 正则表达式删除字符之前的所有文本 但是当我尝试时这也不起作
  • Windows 上的信号处理

    我有一个独立的 PHP 脚本 我将处理从 Windows 操作系统发送的信号 以便在发出 终止信号 时正常关闭 我怎样才能在 Windows 上做到这一点 2020 年 3 月更新 从 PHP 7 4 开始 有sapi windows se
  • IBM Websphere:Spring AOP 出现错误

    我在启动服务器时收到以下错误 应用程序中包含 Spring 和 AspectJ 类 Caused by java lang VerifyError JVMVRFY013 class loading constraint violated c
  • 在 IE6 中调试 JavaScript [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个可以调试 JavaScript 的工具withinIE6 我的意思是我希望调试器在浏览器中运行 a l 萤火虫 到目前为止我已经尝试过
  • Dojo AMD:无法在 require 中调用函数

    我确实是 dojo 的新手 但当我开始使用 dojo 版本 1 7 2 开发新应用程序时 我也想使用新的 AMD 函数语法 不幸的是我似乎不明白 最让我烦恼的是我不能简单地调用 require 块内的任何函数 例如 我有一个页面 打开时会创
  • 按下后退按钮时如何保留可滚动区域的滚动位置?

    我在一个大的可滚动 div 中有一长串链接 每次当用户单击链接然后单击后退按钮时 它都会从 div 的最顶部开始 这对我们的用户来说并不友好 有什么方法可以让浏览器在按后退按钮时滚动到上一个位置 非常感谢 在页面卸载期间 获取滚动位置并将其
  • pyplot:以 e 为基数的 loglog()

    Python 和 matplotlib 新手是从 R 过来的 所以我希望这个问题不是太白痴 我正在尝试在自然对数刻度上绘制对数对数图 但经过一番谷歌搜索后 我无法弄清楚如何强制 pyplot 在轴上使用基本 e 刻度 我目前拥有的代码 im
  • 在 Tensorflow 中使用字符串标签

    我仍在尝试使用自己的图像数据运行 Tensorflow 我能够使用此示例中的conevert to 函数创建一个 tfrecords文件link 现在我想用该示例中的代码来训练网络link 但在 read and decode 函数中失败
  • 如何序列化第三方不可序列化的最终类(例如google的LatLng类)?

    我在用着Google 的 LatLng 类来自 v2 Google Play 服务 该特定类是最终类 未实现java io Serializable 有什么办法可以做到吗LatLng类工具Serializable public class
  • 如何在静态库中存储版本号?

    如何将版本号存储在静态库 file a 中 然后在 Linux 中检查其版本 附 我需要能够随时检查文件的版本 而无需仅使用 shell 实用程序使用任何特殊的可执行文件 除了提供 Puppe 提到的静态字符串之外 通常的做法是提供一个宏来
  • 齐射请求的匿名侦听器导致内存泄漏

    我正在使用 volley 库进行网络服务调用 我创建了一个通用类来进行所有 Web 服务调用并从那里进行服务调用 并为成功和错误响应创建了匿名侦听器 但是当我使用泄漏金丝雀时 它显示与上下文相关的内存泄漏 下面是我的代码片段 public