为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2022-11-02 17:15:58
我正在尝试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)我从这个错误消息中假设我溢出了堆栈,但我不知道为什么并且没有看到类似的错误。提前致谢。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果您在 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-11-02
  • 1 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信