Andriod项目番茄钟

时间线:

  1. 用户启动计时(25分钟)

  2. 用户切换到其他Fragment(如学习记录)

  3. PomodoroFragment.onDestroyView()被调用 → 界面组件被销毁

  4. 但计时器仍在后台运行(CountDownTimer是独立线程)

  5. 25分钟后计时器完成,调用onFinish()

  6. onFinish()中操作已销毁的btnStart → 空指针异常 → 应用崩溃

java 复制代码
// 你的原始代码问题:
@Override
public void onFinish() {
    isRunning = false;
    btnStart.setText(R.string.start_study);  // ❌ 危险操作
    // ... 其他UI操作
}
java 复制代码
// 你的原始代码:
private void finishStudy() {
    if (countDownTimer != null) {
        countDownTimer.cancel();  // ✅ 停止计时器
    }
    // ❌ 但没有立即更新isRunning状态
    // ❌ 没有清空countDownTimer引用
    resetTimer();  // 延迟的状态更新
}

// 用户点击完成按钮时:

finishStudy()被调用

↓

countDownTimer.cancel()被调用

↓

但此时:已经有一个onTick消息在Handler队列中等待执行!

↓

1秒后:队列中的onTick消息仍然执行 → 时间继续更新

↓

界面显示时间还在走

java 复制代码
private void finishStudy() {
    if (countDownTimer != null) {
        countDownTimer.cancel();  // ❌ 只能阻止新消息,不能取消已进入队列的消息
    }
    // 但队列中可能已经有等待执行的onTick消息
}
java 复制代码
private void finishStudy() {
    // 立即停止计时器并更新状态
    isRunning = false;
    
    if (countDownTimer != null) {
        countDownTimer.cancel();
        countDownTimer = null;  // 释放计时器引用
    }

    // ⭐⭐⭐ 关键修复:立即重置时间,防止Handler队列中的消息继续更新界面
    timeLeftInMillis = 25 * 60 * 1000;
    updateTimer();  // 立即更新界面显示

    // 立即更新按钮状态
    if (btnStart != null) {
        btnStart.setText(R.string.start_study);
    }
    if (etTaskName != null) {
        etTaskName.setEnabled(true);
    }

    if (startTimeMillis > 0 && timeLeftInMillis < 25 * 60 * 1000) {
        saveStudyRecord();
    }

    resetTimer();
}

用户切换到其他Fragment → PomodoroFragment.onDestroyView()被调用

↓

但计时器仍在后台运行(因为onDestroyView()中没有停止计时器)

↓

用户在其他Fragment中点击完成按钮

↓

但此时PomodoroFragment的界面已销毁,btnReset的点击事件无法触发

↓

计时器继续运行,无法停止

相关推荐
念何架构之路1 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo72 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
2401_885885042 小时前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
Percep_gan2 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节
若亦_2 小时前
数据结构>>优先级队列(堆)
java·数据结构
程序猿乐锅3 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog3 小时前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
denlaku3 小时前
JDK 23 新特性详解
java
凯瑟琳.奥古斯特3 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
code2cat3 小时前
Java高级篇之Hibernate:让对象映射到表,理解持久化与事务
java·后端·hibernate·1024程序员节