在 Android 开发中,使用 CountDownTimer 时确实需要注意防止潜在的内存泄漏问题。CountDownTimer 实例在其计时过程中会保持对创建它的上下文(通常是 Activity 或 Fragment)的强引用,如果未正确管理其生命周期,可能会导致上下文无法释放,进而产生内存泄漏。针对您给出的代码片段,这里提供一种解决内存泄漏问题的策略:
CountDownTimer countDownTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
// ... 其他初始化代码
startCountdown(timerInMilliSecond + 200);
}
private void startCountdown(long durationMs) {
stopCountdown(); // 确保之前存在的计时器先停止
countDownTimer = new CountDownTimer(durationMs, 1000) {
@Override
public void onTick(long millisUntilFinished) {
// ... 更新 UI 或执行其他逻辑
}
@Override
public void onFinish() {
countDownTimer = null; // 计时结束时释放引用
// ... 执行计时结束后的逻辑
}
}.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
stopCountdown();
}
private void stopCountdown() {
if (countDownTimer != null) {
countDownTimer.cancel();
countDownTimer = null; // 取消计时器并释放引用
}
}
解决策略详解:
在onCreate()方法中启动计时器:确保计时器在Activity或Fragment生命周期的合适阶段(如onCreate())开始计时。
封装计时器启动方法(如startCountdown()):这样可以在需要重新启动计时器时(如屏幕旋转、配置更改等)方便地调用。在启动计时器前,先调用stopCountdown()方法确保之前存在的计时器已停止。
在CountDownTimer的onFinish()回调中释放引用:当计时器完成计时后,将其引用设置为null,使计时器不再持有上下文的强引用,允许垃圾收集器适时回收上下文。
提供stopCountdown()方法:在Activity或Fragment的生命周期方法(如onPause()、onStop()或onDestroy())中调用此方法,确保在用户离开当前界面或组件销毁时及时取消计时器并释放引用。在本示例中,我们在onDestroy()中调用stopCountdown()以确保在销毁时清理计时器。
通过上述策略,您可以确保在Activity或Fragment生命周期结束时正确地取消并释放CountDownTimer的引用,从而避免因CountDownTimer导致的内存泄漏问题。记得根据您的实际代码结构和需求调整上述代码片段。