微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从共享代码发送到平台代码Xamarin.forms时,消息处理中心会多次命中

如何解决从共享代码发送到平台代码Xamarin.forms时,消息处理中心会多次命中

我知道这些问题是关于SO的多次询问。但是我无法解决这个问题。在我的xamarin.forms应用程序中,我正在使用自定义“相机视图”在一页内显示相机。拍照按钮位于共享代码中。为了从共享代码中拍照,我正在使用消息中心。当我们单击该按钮时,从共享代码发送的邮件中心将订阅我的相机自定义渲染,并且将进行拍照操作。

我面临的问题是消息传递中心的订阅部分将被击中多次。奇怪的是,每次单击按钮时,订阅都会增加。我添加了退订消息传递中心。然后它将不再命中。这是什么原因造成的?任何帮助表示赞赏。

我的共享代码部分,消息传递中心发送到该部分。

private async void Capture_Tapped(object sender,EventArgs e)
        {
            try
            {                            
                MessagingCenter.Send<CameraPopup>(this,"CaptureClick");
                            }
            catch (Exception)
            {

            }

        }
                           

Android Camera Custom渲染上的会议中心订阅部分

  protected async override void OnElementChanged(ElementChangedEventArgs<Centraverse.Views.Clocking.CustomCamera.CameraPreview> e)
            {
                base.OnElementChanged(e);
                if (Control == null)
                {
                    cameraPreview = new CameraPreview(Context);
                    SetNativeControl(cameraPreview);
    
                    // This portion hitting multiple times
                    MessagingCenter.Subscribe<CameraPopup>(this,"CaptureClick",(sender) =>
                    {
                        
                        try
                        {
                            Log.Info("Reached here:","Try catch of first ");
                            if (DetectedFaceCount == 0)
                            {
                                //Do Action
                            }
                            else if (DetectedFaceCount == 1)
                            {                           
                                Control.Preview.StopFaceDetection();
                                Task.Run(() => takepicture());
                            }
                            else if (DetectedFaceCount > 1)
                            {
                              //Do Action
                            }
                        }
                        catch (Exception ex)
                        {
                            return;
                        }
    
                     //  MessagingCenter.Unsubscribe<CameraPopup>(this,"CaptureClick");
    
                    });
                }
                if (e.OldElement != null)
                {
                }
                if (e.NewElement != null)
                {
                    try
                    {
                        Control.Preview = Camera.Open((int)e.NewElement.Camera);
    
                        Device.BeginInvokeOnMainThread(async () =>
                        {                                          
                                Control.Preview.SetFaceDetectionListener(this);
                                Control.Preview.StartFaceDetection();                                    
                        });
    
                    }
                    catch (Exception ex)
                    {
                        return;
                    }
                   
                }
    
            }

解决方法

根据您的描述和代码,可能只有一个原因-您多次订阅该活动。因此,您需要先取消订阅或拥有某种已订阅的内部跟踪机制,然后只进行一次。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。