从 setOnChronometerTickListener() 重置时计时器崩溃
Chronometer Crashes on Reset from setOnChronometerTickListener()
我正在尝试在计时器达到特定时间(在本例中为 5 秒)时使用 setOnChronometerTickListener()
重置计时器。然而,当我 运行 它在我的 phone 上时它崩溃了。我正在使用 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.WhosebugError: 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.onChronometerTick(MainActivity.java:88)
at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:347)
at android.widget.Chronometer.setBase(Chronometer.java:176)
我从这个错误消息中假设我正在溢出堆栈,但我无法弄清楚为什么并且没有看到类似的错误。提前致谢。
如果您在 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);
}
}
}
我正在尝试在计时器达到特定时间(在本例中为 5 秒)时使用 setOnChronometerTickListener()
重置计时器。然而,当我 运行 它在我的 phone 上时它崩溃了。我正在使用 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.WhosebugError: 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.onChronometerTick(MainActivity.java:88)
at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:347)
at android.widget.Chronometer.setBase(Chronometer.java:176)
我从这个错误消息中假设我正在溢出堆栈,但我无法弄清楚为什么并且没有看到类似的错误。提前致谢。
如果您在 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);
}
}
}