Xamarin.Forms Число звонков в центр сообщений увеличивается с каждым разом
У меня проблема, когда я отправляю сообщение один раз, а подписчик вызывается один раз, но в следующий раз он вызывается дважды и так далее... Вот мой код. Это отправитель сообщения
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 ответ
Особенно при использовании вашей страницы внутри навигационной страницы, ваше событие подписки будет добавлено всякий раз, когда страница открывается. Если вы перемещаетесь назад и вперед пару раз, ваша подписка на центр обмена сообщениями будет добавлена несколько раз, в результате чего ваше событие удвоится.
Самый безопасный способ - это подписаться в конструкторе страниц, и даже в этом случае может потребоваться отменить подписку, а затем подписаться.
Ваш подход Появления / Исчезновения может также сработать, однако я не совсем уверен, дают ли методы Появления / Исчезновения вам какие-либо гарантии для стрельбы.
Тем не менее, вы также можете попробовать переместить ваши отписки перед base.OnDisappearing(), так как вы должны отписаться перед вызовом базового класса, чтобы выполнить внутренний демонтаж вашей страницы.
Если это не сработает, подпишитесь в конструкторе.