定时器内存泄漏

2024-02-27

我正在使用一个在侦听器事件上取消并重新启动的计时器。除了计时器线程泄漏整个外部类之外,一切都工作正常。

我的定时器实现如下:

        if(timer != null) {
            timer.cancel();
            timer = null;
            timer = new Timer();
        }
        timer.schedule(new TimerTask() { // Thread leaks!!!!
            @Override
            public void run() {
              mCallback.onHeaderMoving(newToolbarTranslationY );
            }
        } , 150);

我使用 MAT 分析器来追踪问题并最终解决了这个问题。我还用回调注释掉了该行,但线程仍然泄漏,因此它肯定是计时器本身。但是我真的不明白该代码有什么问题。

据我从我的研究中了解到,问题在于匿名内部类(new Timertask())持有对外部类的引用,因此可能会泄漏整个上下文。但我仍然不明白为什么计时器以及对上下文的引用在线程耗尽后(150 毫秒以上)不会被垃圾收集。

在这种情况下,即使线程完成后,上下文是否仍然没有释放?

最后我该如何解决这个泄漏?我将计时器设置为空,但这并没有解决我的问题。

Edit

 private OnHeaderMovingCallBack mCallback;
 private Timer timer = new Timer();

 //... some other parameters


public ScrollingToolbarManager(View toolbar , View pagerStrip , AbsListView listView , OnHeaderMovingCallBack headerMovingCallBack){
    this.toolbar = toolbar;
    this.pagerStrip = pagerStrip;

    this.listView = listView;

    mCallback = headerMovingCallBack;

    changeStartValues();

}

public static interface OnHeaderMovingCallBack{
    public void onHeaderMoving(int translationY);
}

 public void moveHeader(){

      //... some calculations

    //timer implementation from above
 }

moveHeader() 在列表视图的滚动事件上调用


如果您认为问题在于匿名内部类持有对外部类的引用,那么只需使用静态命名内部类 - 这将不持有任何引用。在你的班级中放置这样的东西:

static class MyTimerTask extends TimerTask {
    private OnHeaderMovingCallBack mCallback;
    int newToolbarTranslationY;

    public MyTimerTask(OnHeaderMovingCallBack mCallback, int newToolbarTranslationY) {
        this.mCallback = mCallback;
        this.newToolbarTranslationY = newToolbarTranslationY;
    }

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

定时器内存泄漏 的相关文章

  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • 如何删除日期对象的亚秒部分

    当 SQL 数据类型为时间戳时 java util Date 存储为 2010 09 03 15 33 22 246 如何在存储记录之前将亚秒设置为零 例如 在本例中为 246 最简单的方法是这样的 long time date getTi
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Android模拟器中的网络访问

    我试图通过我的 Android 应用程序访问互联网 但我既成功又失败 我在构建应用程序时启动模拟器 并且应用程序安装得很好 我可以使用浏览器访问互联网 但是 当我尝试这个小代码片段时 InetAddress inet try inet In
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • Android SearchView 在启动时隐藏键盘

    我有一个小问题正在尝试解决 当我打开应用程序时 键盘会显示输入搜索视图的查询 不过 我只想在单击搜索视图时显示键盘 我该如何解决 Thanks 这对我有用 用于隐藏焦点的代码 searchView SearchView view findV
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何在android中通过蓝牙向配对设备发送短信?

    在我的应用程序中 我想通过蓝牙发送和接收短信 我可以在列表视图中看到配对设备名称和地址的列表 但是当我尝试向配对设备发送文本时 什么也没有发生 在其他设备中没有收到文本 这是我向配对设备发送消息的代码 private void sendDa
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • fs-extra:源和目标不能相同。 (科尔多瓦)

    我在使用 cordova 构建时遇到错误 Error Source and destination must not be the same 构建系统 Ionic ionic cli 4 10 1 ionic framework ionic
  • 如何更改操作栏背景和文本颜色

    我正在使用本教程中的导航抽屉 http www androidhive info 2013 11 android sliding menu using navigation drawer http www androidhive info
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • LifeCycleAware Fragment 中的片段生命周期事件

    我有一个生命周期感知片段和一个LifecycleObserver class public class MyFragment extends Fragment Override public void onCreate Nullable B

随机推荐

  • 使用按位运算符的算术运算符[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有办法通过使用执行加法 或算术运
  • 自动最大化图形

    我正在 MATLAB 中创建一些图形并自动将它们保存到文件中 问题是根据定义图像很小 手动解决我的问题的一个好方法是创建一个图像 图形 将其最大化 然后保存到文件中 我错过了自动最大化数字的这一步 有什么建议么 到目前为止我只发现了这个 h
  • 支持带电话功能和不带电话功能的 Android 设备

    我有一个应用程序可以在具有电话功能和不具有电话功能的设备上运行 以下是我的一些疑问 1 我能够支持这两种类型的设备吗 2 对于具有电话功能的设备 我需要启用通话功能 对于没有电话功能的设备 我将禁用通话功能 我不太清楚 和 概念 有没有办法
  • 强制 Grails/Weblogic 仅使用 HTTPS 协议进行重定向

    我在项目中使用 Grails 2 2 2 并且我的应用程序发出不需要的 http 重定向而不是 https 重定向 目前 我们在 Oracle Weblogic 前面有一个 F5 负载均衡器 F5 正在从 Weblogic 卸载我们的 SS
  • Swift 支持静态类吗?

    我想知道您是否可以在 swift 中创建类似于 C 中的静态类 即无法实例化的类 只能具有静态函数和静态属性 这些类型的课程可以快速实现吗 如果没有 考虑到 Swift 中可用的工具 重新创建这种设计模式的最有效方法是什么 不 Swift
  • HBase:使用Java API创建表时指定版本

    我知道我们可以通过以下方式从 hbase shell 执行此操作 create t1 NAME gt f1 VERSIONS gt 5 我在中找不到任何相应的选项HTableDesctiptor在 Java API 中 知道如何做到这一点吗
  • 错误:无法统计文件“XX.csv”:未知错误

    我运行这个命令 COPY XXX FROM D XXX csv WITH FORMAT CSV HEADER TRUE NULL NULL 在Windows 7中 它可以成功导入小于1GB的CSV文件 如果文件大于 1GB 我会收到 未知错
  • 数据结构,C#:~O(1) 使用范围键查找?

    我有一个数据集 该数据集将提供一个查找表 给定一个数字 我应该能够查找该数字的相应值 不过 数据集 假设是 CSV 有一些注意事项 代替 1 ABC 2 XYZ 3 LMN 这些数字是范围 是 通过 而不是负数 1 3 ABC 1 2 an
  • 从 swift 3 迁移到 swift 4 - 无法将 String 转换为预期的 String.Element

    我正在将代码从 swift 3 转换为 swift 4 并在以下代码中收到此错误 即使当我尝试使用 flatmap 展平数组时我也会得到这个 无法将 String 类型的值转换为预期的参数类型 String Element 又名 字符 if
  • 将日期中的月份日期更改为第一天 (01)

    我想将月份中的某一天设置为Date到当月的开始日期 01 现在我使用以下内容 currentDate lt Sys Date for getting current system date eg 2012 11 06 formatDate
  • 如何提取 OLE 容器的内容?

    我需要打开 MS Word 文件 doc 并提取其组成文件 1 CompObj WordDocument 等 像 7 zip 这样的东西可以用来手动执行此操作 但我需要以编程方式执行此操作 我发现 Word 文档是一个 OLE 容器 因此可
  • Java对象分配开销

    我正在用 Java 编写一个不可变的 DOM 树 以简化多线程的访问 然而 它确实需要尽可能快地支持插入和更新 由于它是不可变的 如果我对树的第 N 层上的节点进行更改 我需要分配至少 N 个新节点才能返回新树 我的问题是 预先分配节点而不
  • 数据框能做什么而 tibble 不能做什么?

    Tidyverse 的粉丝经常给出使用 tibbles 而不是数据帧的几个优点 其中大多数似乎都是为了保护用户免于犯错误而设计的 例如 与数据帧不同 tibbles 不需要一个 drop FALSE不从数据中删除维度的论点 不会让 运算符对
  • 如何在点击推送通知时打开Fragment

    我的 Firebasemessagingservice 类代码用于传递意图 private void showNotification String message Intent intent new Intent this DrawerA
  • 您使用哪种布局管理器?

    大家都用什么java GUI布局管理器 最近 我一直在使用米格布局 http www miglayout com 其中有一些强大的组件控件 只是想看看其他开发人员除了标准 JDK 之外还使用什么 米格布局 http www miglayou
  • 在 CollapsingToolbarLayout 中以编程方式更改layout_scrollFlags

    我的 xml 中有以下 CollapsingToolbarLayout 标记
  • C# 类的属性包

    访问 C 类属性 如 JavaScript 语言 将使生活变得更加轻松 我们如何在 C 中做到这一点 例如 someObject Property simple string Console WriteLine someObject Fir
  • 比较 Oracle 中的字符串

    我需要在表中查询给定字符串的值 该表区分大小写 但我想在比较中执行 ToLower 假设我有一个包含以下数据的类表 class teacher Mat101 Smith MAT101 Jones mat101 Abram ENG102 Sm
  • Perl 中 grep 的“no autovivication”编译指示失败

    我正在尝试使用该模块关闭自动激活 https metacpan org pod autovivification https metacpan org pod autovivification但 grep 失败 usr bin env pe
  • 定时器内存泄漏

    我正在使用一个在侦听器事件上取消并重新启动的计时器 除了计时器线程泄漏整个外部类之外 一切都工作正常 我的定时器实现如下 if timer null timer cancel timer null timer new Timer timer