c# - Toast 多次显示
问题描述
我正在开发适用于 Android 的 QR 阅读器应用程序。该应用程序的要点是使用手机摄像头读取二维码。如果用户没有使用该应用程序,相机会在一定时间后停止(Timer
为此使用 a)以防止电池消耗并振动手机,显示敬酒和消息,指示用户按下按钮以重新激活相机然后继续他的工作。
问题是,当事件第一次被触发时,一切都按我的预期工作,但如果它被第二次触发,Toast 将显示两次,如果事件被触发 N 次,依此类推。
此解决方法背后的逻辑在这里:
“恢复”相机功能的按钮逻辑:
btnEncenderCamara.Click += (sender, e) => {
camara.Start(lectorQR.Holder);
btnEncenderCamara.Enabled = false;
timerToDisableCamera.Interval = 6000;
timerToDisableCamera.Elapsed += new ElapsedEventHandler(timerElapsed);
timerToDisableCamera.Start();
};
和计时器的事件逻辑在这里:
protected void timerElapsed(object sender, ElapsedEventArgs e) {
try
{
timerToDisableCamera.Stop();
RunOnUiThread(() => {
Vibrator vibrator = (Vibrator)GetSystemService(Context.VibratorService);
vibrator.Vibrate(1000);
camara.Stop();
btnEncenderCamara.Enabled = true;
Toast.MakeText(this, "La cámara se ha detenido para ahorrar en cosumo de batería. Presione 'ENCENDER CÁMARA' para encender la cámara nuevamente", ToastLength.Short).Show();
});
}
catch (Exception ex)
{
throw;
}
}
一旦停止相机的事件被触发,我需要找到如何避免 Toast 多次显示。
解决方案
请注意,在您的 btnEncenderCamara.Click 事件中,每次触发 btnEncenderCamara.Click 时,您都会为 timerToDisableCamera.Elapsed 事件订阅一个新委托。
因此,每次后续调用 btnEncenderCamara.Click 时,都会多次调用 timerElapsed 方法。
解决此问题的一种方法是在调用 timerToDisableCamera.Stop() 之后在 timerElapsed 方法中取消订阅您的委托,如下所示:
protected void timerElapsed(object sender, ElapsedEventArgs e) {
try
{
timerToDisableCamera.Stop();
timerToDisableCamera.Elapsed -= new ElapsedEventHandler(timerElapsed);
RunOnUiThread(() => {
Vibrator vibrator = (Vibrator)GetSystemService(Context.VibratorService);
vibrator.Vibrate(1000);
camara.Stop();
btnEncenderCamara.Enabled = true;
Toast.MakeText(this, "La cámara se ha detenido para ahorrar en cosumo de batería. Presione 'ENCENDER CÁMARA' para encender la cámara nuevamente", ToastLength.Short).Show();
});
}
catch (Exception ex)
{
throw;
}
}
或者,您可以重构代码以仅初始化计时器一次,这将使您的逻辑保持精简,如下所示:
// I'm assuming this method is an entry point for initialization in your Android activity.
void OnLoad()
{
// I'm assuming timerToDisableCamera already have an instance of Timer, otherwise you will get a NullReferenceException.
timerToDisableCamera.Interval = 6000;
timerToDisableCamera.Elapsed += new ElapsedEventHandler(timerElapsed);
// And also assuming that btnEncenderCamara is already an instance of Button.
btnEncenderCamara.Click += (sender, e) => {
camara.Start(lectorQR.Holder);
btnEncenderCamara.Enabled = false;
timerToDisableCamera.Start();
};
}
protected void timerElapsed(object sender, ElapsedEventArgs e)
{
try
{
timerToDisableCamera.Stop();
RunOnUiThread(() => {
Vibrator vibrator = (Vibrator)GetSystemService(Context.VibratorService);
vibrator.Vibrate(1000);
camara.Stop();
btnEncenderCamara.Enabled = true;
Toast.MakeText(this, "La cámara se ha detenido para ahorrar en cosumo de batería. Presione 'ENCENDER CÁMARA' para encender la cámara nuevamente", ToastLength.Short).Show();
});
}
catch (Exception ex)
{
throw;
}
}
推荐阅读
- c# - Exclude values "starting with" from column in WPF DataGrid
- python-3.x - 获取本地网络上未在 /etc/hosts 中设置的远程计算机的主机名
- r - .5 的 R round() 规则
- python - 为什么我的样本权重会破坏我的神经网络?
- odoo - 如何为 res.user 而不是 res.partner 在 Odoo 的 Web 模块中自动登录?
- javascript - 使用 VueJs 导入 json 的问题
- python - 在 Heroku 上部署 Django?
- javascript - 将存储的数组对象显示为 Javascript 到 HTML 中的列表
- java - 如何提供静态页面
- python - Neo4j 连接失败 - Bitnami AWS