Xamarin.Forms每次呼叫消息中心的次数都会增加

时间:2018-07-18 07:11:33

标签: firebase xamarin.forms firebase-storage messagingcenter

我有一个问题,我发送一次消息,而一次调用Subscriber,但是下次调用两次,依此类推...这是我的代码。 这是邮件发件人

public void OnSuccess(Java.Lang.Object result)
    {
        UploadTask.TaskSnapshot taskSnapShot = (UploadTask.TaskSnapshot)result;

        string downloadURL = taskSnapShot.DownloadUrl.ToString();
        string fileName = taskSnapShot.Metadata.Name;

        GBPaperReceipt.Model.ImageFile imageFile = new Model.ImageFile
        {
            FileName = fileName,
            FilePath = downloadURL
        };
        MessagingCenter.Send((App)Xamarin.Forms.Application.Current, MessageStrings.ImageUploadEvent, imageFile);

        //save this live storage image url in receipt table

        //MessagingCenter.Send<Xamarin.Forms.Application, string>((Xamarin.Forms.Application)Xamarin.Forms.Application.Current, ChatModuleConstant.UploadMediaEvent, downloadURL);
    }

这是消息接收者

MessagingCenter.Subscribe<App, ImageFile>((App)Application.Current, MessageStrings.ImageUploadEvent,async (a, imageFile) =>
        {
            _viewModel.Receipt.ImagePath = imageFile.FilePath;
            _viewModel.Receipt.ImageName = imageFile.FileName;
            try
            {
                await DependencyService.Get<IReceiptService>().SaveReceipt(_viewModel.Receipt);
            }
            catch (Exception ex)
            {
                await DisplayAlert(
                            "Error!", ex.Message, "OK");
            }


            DependencyService.Get<ICamera>().DeletePhoto(_viewModel._imageToBeDeletedOnSaveCommand);
            Dialogs.HideLoading();
            Application.Current.MainPage = new NavigationPage(new DashboardPage());
        });

退订

protected override void OnDisappearing()
    {
        base.OnDisappearing();
        MessagingCenter.Unsubscribe<App, string>((App)Application.Current, MessageStrings.ErrorEvent);
        MessagingCenter.Unsubscribe<App, string>((App)Application.Current, MessageStrings.ImageUploadEvent);
    }

1 个答案:

答案 0 :(得分:0)

尤其是在导航页面内使用页面时,只要页面进入视图,您的订阅事件都会被添加。如果您前后导航几次,则对消息传递中心的订阅将被添加几次,从而使事件倍增。

最安全的方法是在页面构造函数中进行订阅,即使在这种情况下,也有必要先取消订阅然后再进行订阅。

您的“出现/消失”方法也可能会起作用,但是我不能完全确定“出现/消失”方法能否为您解雇。

但是,您也可以尝试将取消订阅移动到base.OnDisappearing()的前面,因为您应该在调用基类进行页面的内部拆除之前取消订阅。

如果这不起作用,请订阅构造函数。