从 setOnChronometerTickListener() 重置时计时器崩溃

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


我尝试将计时器重置为不同的值,但它仍然崩溃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)

我从这个错误消息中假设我溢出了堆栈,但我不知道为什么并且没有看到类似的错误。提前致谢。


拉丁的传说
浏览 100回答 1
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);        }    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java