1

我不是专家WeakReferences,因为我刚刚在此过程中认识了他们。

我在我的活动中使用Timerwith 。TimerTask众所周知,只要您调用 Timers,就不能重用cancel()它们,除非您创建它的新实例。

所以我正在做的是Timer在我的活动中创建一个全局。

Timer timer;

在我的 onResume() 中,我通过timer = new Timer();

这样做的原因是为了避免Timer already cancelled异常。因为 onPause() 可能会在手机屏幕锁定或其他任何情况下被调用,而我正在调用timer.cancel()我的onPause()方法。

我的问题是,当计时器被取消时,它是否会自动变得容易Garbage collection因为再次使用它完全没有意义 AFAIK。如果是这种情况,收集它的速度有多快?

使用 a WeakReferencehere 会派上用场吗?如果没有,它在哪里有帮助?

4

1 回答 1

0

无论 Timer 是否有资格被 GC 处理,您都不会从保留实例中受益WeakReferenceTimer因为正如您所说,它在cancel().

WeakReference跟踪您可以使用的对象很有用,但如果没有其他人使用它,则不希望将该对象保留在 RAM 中(即没有人保留对它的 [硬] 引用)。然后它将被 GC'ed 并且你WeakReference也变得无用。(并且您不会通过仅保留对象来阻止对象的 GC WeekReference)。

嗯,希望不要太含糊。

我个人WeakReferences曾经粗略地了解 junit 测试中可能存在的内存泄漏。

我可以给您另一个使用示例 -您可以将自定义定义为静态嵌套类并将您的实例保留为私有成员,而不是Handler在类中定义自定义内部类,Activity该类对您的隐式引用并可能造成潜在的内存泄漏,因此您可以继续从自定义类中调用您的方法。ActivityHandler classWeakReferenceActivityActivityHandler

于 2013-10-28T21:48:57.400 回答