Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 吐司不止一次被展示_C#_.net_Xamarin.android - Fatal编程技术网

C# 吐司不止一次被展示

C# 吐司不止一次被展示,c#,.net,xamarin.android,C#,.net,Xamarin.android,我正在为Android开发一款QR阅读器应用程序。该应用程序的要点是使用手机摄像头读取二维码。如果用户未使用应用程序,则相机会在特定时间后停止(使用计时器进行此操作),以防止电池消耗并使手机振动,并显示一个祝酒词,其中包含一条消息,指示用户按下按钮重新激活相机,然后继续他的工作 问题是,当事件第一次被触发时,一切都如我所期望的那样工作,但是如果它再次被触发,则Toast将显示两次,如果事件被触发N次,则以此类推 此解决方案背后的逻辑如下: “恢复”相机功能的按钮逻辑: btnEncenderCa

我正在为Android开发一款QR阅读器应用程序。该应用程序的要点是使用手机摄像头读取二维码。如果用户未使用应用程序,则相机会在特定时间后停止(使用
计时器进行此操作),以防止电池消耗并使手机振动,并显示一个祝酒词,其中包含一条消息,指示用户按下按钮重新激活相机,然后继续他的工作

问题是,当事件第一次被触发时,一切都如我所期望的那样工作,但是如果它再次被触发,则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”方法上发布的一样,它可以工作:)所以感谢您的回复。我会把你的回答作为我问题的答案。很高兴能帮上忙:-)