C# 吐司不止一次被展示
我正在为Android开发一款QR阅读器应用程序。该应用程序的要点是使用手机摄像头读取二维码。如果用户未使用应用程序,则相机会在特定时间后停止(使用C# 吐司不止一次被展示,c#,.net,xamarin.android,C#,.net,Xamarin.android,我正在为Android开发一款QR阅读器应用程序。该应用程序的要点是使用手机摄像头读取二维码。如果用户未使用应用程序,则相机会在特定时间后停止(使用计时器进行此操作),以防止电池消耗并使手机振动,并显示一个祝酒词,其中包含一条消息,指示用户按下按钮重新激活相机,然后继续他的工作 问题是,当事件第一次被触发时,一切都如我所期望的那样工作,但是如果它再次被触发,则Toast将显示两次,如果事件被触发N次,则以此类推 此解决方案背后的逻辑如下: “恢复”相机功能的按钮逻辑: btnEncenderCa
计时器进行此操作),以防止电池消耗并使手机振动,并显示一个祝酒词,其中包含一条消息,指示用户按下按钮重新激活相机,然后继续他的工作
问题是,当事件第一次被触发时,一切都如我所期望的那样工作,但是如果它再次被触发,则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事件中,您正在向timerToDisableCamera.Appeased事件订阅一个新的委托,每次触发btnEncenderCamara.Click
因此,每次后续调用btnEncenderCamara.Click时,都会多次调用TimeRecursed方法
解决此问题的一种方法是,在调用timerToDisableCamera.Stop()后,在TimeRecursed方法中取消订阅代理,如下所示:
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;
}
}
或者,您可以重构代码,只初始化计时器一次,这将保持逻辑精简,如下所示:
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;
}
}
谢谢你花时间阅读我的帖子。我假设我可以将“OnLoad”方法的行添加到“OnCreate”方法中,该方法触发我的活动,使用手机摄像头只创建一次计时器。我会测试一下,然后告诉你发生了什么。再次感谢您的回复和时间。我已经重构了我的代码,就像您在我的“OnCreate”方法上发布的一样,它可以工作:)所以感谢您的回复。我会把你的回答作为我问题的答案。很高兴能帮上忙:-)