我不是WeakReferences
的专家,因为我现在正在熟悉他们。
我在我的活动中使用Timer
和TimerTask
。
众所周知,只要你在它们上面调用cancel()
,就不能重复使用定时器,直到你创建它的新实例。
所以我正在做的是在我的活动中全局创建Timer
。
Timer timer;
并在我的onResume()中,我通过timer = new Timer();
这样做的原因是避免Timer already cancelled
例外。因为当移动设备获得屏幕锁定或其他任何内容时,可能会调用onPause(),我在timer.cancel()
方法中调用onPause()
。
我的问题是,当计时器被取消时,它会自动变为Garbage collection
,因为再次使用AFAIK完全没有意义。如果是这种情况,收集的速度有多快?
使用WeakReference
这里派上用场了吗?如果没有,它在哪里使用它?
答案 0 :(得分:0)
无论是否有资格使用Timer,您都无法保留WeakReference
到Timer
个实例,因为正如您所说的那样,{{1}之后不能重复使用它}。
cancel()
对于跟踪可以使用的对象很有用,但如果没有其他人使用它,则不希望将该对象保留在RAM中(即没有人保持[硬] ]引用它)。然后它将被GC,你的WeakReference
也变得无用。 (并且您不会通过仅保留WeakReference
来阻止对象的GC。
嗯,希望它不是太模糊。
我个人使用WeekReference
粗略了解junit测试中可能存在的内存泄漏。
我可以给你另一个用法示例 - 而不是在WeakReferences
类中定义的自定义内部Handler
类,它隐式引用了你的Activity
并且可能会产生潜在的内存泄漏,您可以将自定义Activity
定义为静态嵌套类,并将Handler class
实例作为私有成员保留在WeakReference
实例中,这样您就可以继续在自定义{{}内调用Activity
方法1}} class。