You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每天零点将水平ProgressBar重置为0,现有方案无反应该如何解决

现有实现错误说明

  • 存在语法问题无法正常编译:变量counter重复声明类型、Progressbar类名大小写错误、progressbar.setProgress(counter)语句缺失结束分号。
  • 逻辑触发机制错误:时间判断代码仅在onCreate生命周期执行一次,只有精准在23:59:59那一秒打开Activity才会触发重置,绝大多数场景下都不会执行到重置逻辑,所以进度条无响应。
  • 重置逻辑不完整:即使触发了时间判断,仅重置了ProgressBar进度,未同步重置counter变量,后续点击按钮会延续之前的计数,进度条会直接跳回之前的数值,等于重置未生效。

可行实现方案

方案1:仅App前台运行时生效(轻量实现)

使用Handler定时任务实现,不需要额外引入依赖,适合仅App处于前台时需要生效的场景。

  1. 修正变量声明等语法错误
  2. 计算当前时间到次日0点的时间差,作为首次任务触发的延迟时间
  3. 任务触发时同步重置counter变量和ProgressBar进度,之后每隔24小时重复执行一次
  4. Activity销毁时移除定时任务,避免内存泄漏

核心代码示例:

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private Button btn;
    // 修正变量声明错误
    private int counter = 0;
    private ProgressBar progressBar;
    // 定时任务相关
    private final Handler resetHandler = new Handler(Looper.getMainLooper());
    private final Runnable resetRunnable = new Runnable() {
        @Override
        public void run() {
            // 同步重置计数和进度
            counter = 0;
            textView.setText(String.valueOf(counter));
            progressBar.setProgress(0);
            // 24小时后再次执行
            resetHandler.postDelayed(this, 24 * 60 * 60 * 1000);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.txtvw);
        progressBar = findViewById(R.id.progressbar_Horizontal);
        progressBar.setMax(10);
        btn = findViewById(R.id.btn_clc);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                counter++;
                textView.setText(String.valueOf(counter));
                progressBar.setProgress(counter);
            }
        });

        // 计算到次日0点的延迟时间
        Calendar current = Calendar.getInstance();
        Calendar nextMidnight = Calendar.getInstance();
        nextMidnight.set(Calendar.HOUR_OF_DAY, 0);
        nextMidnight.set(Calendar.MINUTE, 0);
        nextMidnight.set(Calendar.SECOND, 0);
        nextMidnight.set(Calendar.MILLISECOND, 0);
        nextMidnight.add(Calendar.DATE, 1);
        long delay = nextMidnight.getTimeInMillis() - current.getTimeInMillis();
        // 提交定时任务
        resetHandler.postDelayed(resetRunnable, delay);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 移除任务避免内存泄漏
        resetHandler.removeCallbacks(resetRunnable);
    }
}

方案2:App退后台仍可生效

如果需要App关闭后到点也能执行重置逻辑,可使用Jetpack的WorkManager组件实现:

  • 自定义Worker类实现重置逻辑,通过本地广播将重置事件通知给前台Activity
  • 构建周期为24小时的定时任务,设置首次执行时间为次日0点,提交给WorkManager托管
  • Activity注册广播接收器,收到重置事件后同步更新计数器和进度条即可,适配全安卓版本,稳定性优于旧版的AlarmManager、JobScheduler等API。

内容的提问来源于stack exchange,提问作者priyadarshan nadar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 17:57:04