【问题标题】:Chronometer Crashes on Reset from setOnChronometerTickListener()从 setOnChronometerTickListener() 重置时计时器崩溃
【发布时间】:2019-05-02 22:32:18
【问题描述】:

当计时器达到特定时间(在本例中为 5 秒)时,我正在尝试使用 setOnChronometerTickListener() 重置计时器。但是,当我在手机上运行它时它会崩溃。我正在使用this quesion 的解决方案来重置计时器。

我尝试将计时器重置为不同的值,但它仍然在chronometer.setBase(SystemClock.elapsedRealtime()); 崩溃

这就是我的实现方式:

chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
      @Override
      public void onChronometerTick(Chronometer chronometer) {
              if(chronometer.getText().toString().equalsIgnoreCase("00:05")) {
                        // Reset Chronometer
                        chronometer.stop();
                        chronometer.setBase(SystemClock.elapsedRealtime());


              }
      }
});

这是我从 Logcat 得到的错误消息:

2019-05-02 14:47:39.469 13143-13143/com.example.pomodoro_2 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.pomodoro_2, PID: 13143
    java.lang.StackOverflowError: stack size 8MB
        at android.widget.Chronometer.updateRunning(Chronometer.java:321)
        at android.widget.Chronometer.stop(Chronometer.java:252)
        at com.example.pomodoro_2.MainActivity$3.onChronometerTick(MainActivity.java:88)
        at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:347)
        at android.widget.Chronometer.setBase(Chronometer.java:176)

我从这个错误消息中假设我正在溢出堆栈,但我无法弄清楚为什么并且没有看到类似的错误。提前致谢。

【问题讨论】:

  • 使用 postDelay 在处理程序中启动和停止计时器并再次检查。

标签: java android chronometer


【解决方案1】:

如果您在 if 条件中添加了一个日志,您会在 00:05 之后在 logcat 中看到该日志。 我通过从计时器中删除监听器来防止它。

chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
      @Override
      public void onChronometerTick(Chronometer chronometer) {
              if(chronometer.getText().toString().equalsIgnoreCase("00:05")) {
                        // Reset Chronometer
                        chronometer.setOnChronometerTickListener(null);
                        chronometer.stop();
                        chronometer.setBase(SystemClock.elapsedRealtime());


              }
      }
});

但如果您需要此侦听器,您可以从 Chronometer.OnChronometerTickListener 实现您的片段并实现 OnChronometerTickListener,如下所示:

  public class MainActivity extends AppCompatActivity implements Chronometer.OnChronometerTickListener {

    private String TAG = "MainActivity";
    Button start;
    Chronometer chronometer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        chronometer = findViewById(R.id.chron);
        start = findViewById(R.id.btn);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                chronometer.start();
            }
        });
        chronometer.start();
        chronometer.setOnChronometerTickListener(this);

    }

    @Override
    public void onChronometerTick(Chronometer chronometer) {
        if (chronometer.getText().toString().equalsIgnoreCase("00:05")) {
            // Reset Chronometer
            chronometer.setOnChronometerTickListener(null);
            chronometer.stop();
            Log.d(TAG, "onChronometerTick: stop");

            chronometer.setBase(SystemClock.elapsedRealtime());
            chronometer.setOnChronometerTickListener(this);


        }

    }
}

【讨论】:

    猜你喜欢
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多