我是否应该担心内存泄漏以及在 Android 中将 WeakReference 与 Volley 一起使用

2024-05-02

看完之后本文 http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html,我开始考虑 Volley 的内存泄漏问题。 通常,用 Volley 实现的侦听器具有对外部类(活动)的隐式或显式引用。例如:

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET,
        url, null, 
        new Response.Listener<JSONObject>() {
            @Override 
            public void onResponse(JSONObject response) {

                updateLayout(); 
            } 
        }

在这种情况下,存在隐式引用...或者我可能想要创建一个自定义 JsonObjectRequest 来内部化响应处理,并且需要在其构造函数中传递对调用活动的引用。

现在假设我启动了一个 Web 请求,但在响应返回之前,我离开了启动该请求的活动。据我了解,JsonObjectRequest 对象将保留对我的活动的引用并防止其被垃圾收集。
-我的理解正确吗?这是合理的恐惧吗?
- Volley 库会自动处理这个问题吗?
-如果要创建自定义 JsonObjectRequest 并传入“this”(对活动的引用),我是否需要创建对该活动的 WeakReference?


根据查看 volley 代码,调用 cancel 并不能真正避免内存泄漏,因为引用永远不会被清除,并且引用并不弱。调用 cancel 只会避免 Volley 将响应传递给侦听器。

我对这个问题的解决方案必须是自己克隆和修改库。

  • 解决方案之一是将基类 Request.java 内的基类 ErrorListener 引用设置为弱引用。同样,可以对 JsonRequest.java 内部的监听器执行相同的操作。

  • 另一种解决方案是在调用取消时手动清除引用。在cancel()内部,将mErrorListener和mListener设置为null。但使用此解决方案时,您必须从字段声明中删除 Final 修饰符,否则您将无法将引用设置为 null。

希望这可以帮助。

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

我是否应该担心内存泄漏以及在 Android 中将 WeakReference 与 Volley 一起使用 的相关文章

  • Android 上谷歌地图的缩放事件

    我们正在构建一个使用 Android 版谷歌地图 API 的应用程序 我有我的 MapController 和 MapView 并且我使用以下方法启用内置缩放控件 mapView setBuiltInZoomControls true 我现
  • 如何使用android canvas绘制一个只有左上角和右上角为圆角的矩形?

    我找到了一个用于所有 4 个角均为圆角的矩形的函数 但我只想将顶部 2 个角设为圆角 我能做些什么 canvas drawRoundRect new RectF 0 100 100 300 6 6 paint 对于 API 21 及更高版本
  • 在 JellyBean 上使用 LogCat

    我有一个非常随机发生的错误 所以我依赖LogCat我从 Play 商店购买的监控应用程序 以查看发生时设备上抛出的异常 自从使用 Jelly Bean 以来 我没有看到任何日志记录 我读过 使用 Jelly Bean 应用程序只能看到Log
  • Android API版本兼容性

    我希望我的应用程序能够在 Android 版本 2 1 和 2 2 上运行 在我的应用程序的一个区域中 有一个肖像式相机 生成肖像相机预览的过程在两个操作系统版本上是不同的 据我所知 具体方法如下 2 1 Camera Parameters
  • 在运行时在 FloatingActionButton 上设置layout_anchor

    我正在尝试为固定到我的 AppBarLayout 的 android support design widget FloatingActionButton 制作动画 我可以在布局 xml 中对其进行很好的设置 并且它显示得很好 但是 我正在
  • 在 Android 和 iOS 上播放的视频/音频编解码器设置是什么

    哪些编解码器设置将生成可在 Android videoView 和 iOS UIWebView 上播放的有效视频 安卓 http developer android com guide appendix media formats html
  • “_Smi”不是“bool”类型的子类型 - Flutter MethodChannel

    收到这个奇怪的错误 似乎 MethodChannel 正在转换为 int 而不是 bool 06 07 00 16 26 589 3678 4993 E flutter ERROR topaz lib tonic logging dart
  • 如何将图片保存到文件中?

    我正在尝试使用标准意图来拍照 然后允许批准或重新拍摄 然后我想将图片保存到文件中 这是我正在使用的意图 Intent intent new Intent android provider MediaStore ACTION IMAGE CA
  • 如何在Android中的多个Activity之间切换

    我有 8 个屏幕 我为此准备了 8 个活动 在第一个活动中我给出了这段代码 从 Is 活动切换到 IInd 在图像按钮上给出单击 public void onClick View v Intent myIntent new Intent v
  • 在 Android Studio 中设置 Http 代理

    我已经阅读了多个类似的问题和文档 但我无法解决我的机器所在的公司防火墙的问题 我收到的错误是 无法刷新 Gradle 项目 未知主机 services gradle org 我所阅读和理解的所有内容都让我相信这是一个 http 代理问题 我
  • AlertDialog setButton 已弃用

    我在我的 Eclipse Android 项目中使用此代码 alertDialog setButton OK new DialogInterface OnClickListener Override public void onClick
  • 自定义 AlertDialog - android.R.id.custom 的问题

    我确信我错过了这里的重点 所以我希望有人能解释一下 我想在用户触摸时创建一个弹出窗口ImageView 我看了一下AlertDialog文档说 如果您想显示更复杂的视图 请查找名为 custom 的 FrameLayout 并将您的视图添加
  • 获取TextView的高度

    我有一些文字将被放入TextView 我这样做是使用setText 现在我需要找到文本在文本中占据的行数或高度TextView 我尝试使用getHeight 但它总是返回 0 无论如何 有没有办法获得文本中存在的文本的高度TextView
  • Android中的SQLite是否有内存缓存以及如何释放或清除它?

    首先 我在 Android 应用程序中创建一个名为 mydb 的数据库 DBHelper dbHelper new DBHelper context mydb null 1 DBHelper is my custom class 并将一些数
  • 从 Android 模拟器使用 WebView WebGL

    据我了解 WebGL 仅在 Android Lollipop 中的 WebView 更新 Play 商店中的 WebView 组件 和较新版本 无需 Play 商店更新 中受支持 但是 我有一个使用 Android 7 1 1 的模拟器 并
  • 已使用不兼容的格式定义属性(此处定义的原始属性)

    添加后无法构建项目 compile com android support design 24 2 0 一直报如下错误 看起来 问题在于支持矢量绘图 某处某些属性被添加两次 例如 构建的values xml文件包含
  • Firebird 和 Android JDBC 驱动程序

    火鸟有问题 我从未与 DB 合作过 服务器 firebird 1 5 上的数据库 添加库 firebird full 2 2 4到 libs 文件夹 将其添加到 Gradle implementation fileTree libs 将其添
  • Android:制作/显示 9patch 图像时的对齐错误

    九号补丁 截屏 布局 XML
  • 水平 RecyclerView 顶部的滚动条

    我正在做简单的演示卧式RecyclerView 我想与回收视图一起显示滚动条 所以我添加了android scrollbars horizontal and android scrollbarSize 5dp 在 XML 中 我可以获得滚动
  • 如何将上下文从一个活动传递到另一个活动?

    我有一个主要活动 它调用另一个活动来显示一些数据 我有一个私有数据库帮助程序对象 我在整个主要活动代码中使用它 有没有办法以优雅的方式将我的主要活动的上下文传递给我的子活动 即 来自子类 类似getCallingActivityContex

随机推荐

  • FXML load() 期间出现 JavaFX IllegalAccessException

    我有一个由以下代码调用的对话框窗口 DialogController是使用模式对话框窗口的辅助类 它主要将控制器引用与其窗口捆绑在一起 void handleServicesEdit ActionEvent event throws IOE
  • Laravel 5.3 Blade 解码 HTML 特殊字符

    我在数据库中保存了一些 HTML 代码 当我将这些数据发送到刀片时 CSS 无法正常工作 在页面源代码中我发现 我该用什么方法将 lt 转换为 有人可以帮助我吗 更改您的语法 to 这应该够了吧
  • 将我的应用程序翻译成匈牙利语

    我用英语开发了一个应用程序 我必须为客户翻译一些匈牙利语文本 我在values 文件夹中有一个menu xml 文件 并在values hu 文件夹中创建一个新的menu xml 我启动手机并选择马扎尔语言 选择了好的语言 我看到了匈牙利语
  • Kotlin:使用地图变换时 {} 和 () 之间的区别?

    我是科特林新手 我总是使用带花括号的地图变换 然后 为什么这有效 gt val x someList map SomeConstructor 这不是吗 val x someList map SomeConstructor 我在在线教程的任何
  • 使用 glmnet 和 lm 的普通最小二乘法

    这个问题是在stackoverflow com q 38378118 https stackoverflow com q 38378118但没有得到满意的答复 0 的 LASSO 相当于普通最小二乘法 但对于以下情况似乎并非如此glmnet
  • AngularJS:清除 $watch

    我的 AngularJS 应用程序中有一个监视功能 scope watch quartzCrystal function 但是 在某些条件之后 在我的示例中 更改我的页面 单页应用程序 https en wikipedia org wiki
  • 如何在iPhone应用程序中每天的特定时间调用一个方法?

    我想在我的 iPhone 应用程序中每天的特定时间调用一个方法 我怎样才能实现这个目标 使用 iPhone SDK 和封闭的应用程序并不能做很多事情 您可以让它在特定时间发送本地推送通知 但在用户手动打开您的应用程序之前不会执行您的代码 请
  • $.each 中的 if 语句,Jquery

    我正在基于从 WebMethod 返回的 JSON 数据构建一些 html 我需要知道如何省略某些 elements based on if a particualr value is present or not I ve got thi
  • Groovy 错误地使用了封闭类的构造函数?

    Given static class Question stuff List
  • 如何修复 IntelliJ 中的包名称?

    是否可以修复 IntelliJ 中给定文件夹中的所有包名称 如果手动导入IntelliJ中的文件 其包名全部错误 包括子文件夹 如何批量修复包名 到目前为止 这给我带来了很多悲伤 移动到包或重命名包 这一定是一个错误 Example 如果我
  • Google应用程序脚本忽略数据验证错误

    我有一些具有数据验证规则的工作表可用作下拉列表 当尝试将其他 未经验证的 数据插入这些单元格时 我的代码现在会产生错误 我正在寻找一种方法来忽略数据验证规则并插入数据而不更改已设置的数据验证规则 我只想忽略应用程序脚本错误 您在单元格 U4
  • 创建无模式消息框

    如何创建一个无模式消息框 我是否必须创建自己的 Windows 窗体类并使用它 如果是这样 是否有一种简单的方法来添加警告图标 而不是插入我自己的图像 并根据文本量调整大小 如果您需要一个在代码继续在后台运行时自动显示的消息框 该框仍然是模
  • ActiveRecord 迁移后的括号 [5.1] 是什么?它是如何工作的? [复制]

    这个问题在这里已经有答案了 使用生成新迁移时bin rails g migration CreateUser第一行如下所示 class CreateUser lt ActiveRecord Migration 5 1 什么是 5 1 代表什
  • PHPUnit:如何测试调用不同文件中声明的另一个函数的方法

    我正在尝试使用 PHPUnit 测试一个方法 它调用另一个函数 独立功能 无类 它驻留在不同的文件中 它做了一些很好的计算并返回一个对象 这是我实际的主要代码 class CreateRecords public function crea
  • 自定义错误消息在 ASP.NET MVC 4 中未翻译

    我想翻译验证消息 字段日期必须是日期 我已将以下键添加到 Global asax 的 Application Start 中 ClientDataTypeModelValidatorProvider ResourceClassKey Mod
  • 汇编指令陷阱有什么作用?

    当程序需要时 程序通常会发出软件陷阱 由操作系统提供服务 通用异常处理程序 操作系统确定陷阱的原因并做出响应 适当地 汇编指令 trap 和 BASIC 中的 TRAP 指令一样吗 答案似乎是肯定的 你能接受还是拒绝我的结论 不中断 的代码
  • VB.NET 中延迟加载属性中静态局部变量的使用

    我最近刚刚了解了 VB NET 中静态局部变量的使用 并想知道它在延迟加载属性中的潜在用途 请考虑以下示例代码 Public Class Foo Implements IFoo End Class Public Interface IFoo
  • std::string 和 std::vector 之间有什么区别?

    那么主要区别是什么 它们将在哪些情况下使用 vector
  • AngularJS、ocLazyLoad 和加载动态状态

    app define angular angular ui router ocLazyLoad config common layout services menuService function angular use strict va
  • 我是否应该担心内存泄漏以及在 Android 中将 WeakReference 与 Volley 一起使用

    看完之后本文 http www androiddesignpatterns com 2013 01 inner class handler memory leak html 我开始考虑 Volley 的内存泄漏问题 通常 用 Volley