簡體   English   中英

Xamarin MessagingCenter:發送一次,接收多次

[英]Xamarin MessagingCenter: sending once, receiving multiples

我在使用 xamarin 消息中心時遇到了一個煩人的問題。 我添加了一些斷點,並注意到只發送了一條消息,但訂閱者收到了兩次。

我的發件人代碼(第 2 頁):

async void CompartilhaMapa(System.Object sender, System.EventArgs e)
{ 

    ...        

   MessagingCenter.Send<Page2, ParamType>(this, "PopUpData", new ParamType() { Tipo = 2, Valor = Coords });
   Console.WriteLine("msg sent"); //displayed only once and line above has a break line assuring this
   await Navigation.PopPopupAsync();
}

第1頁(訂閱者):

protected override void OnAppearing()
{
   base.OnAppearing();
   MessagingCenter.Subscribe<Page2, ParamType>(this, "PopUpData", async (sender, arg) =>
   {
      Task.WaitAll(tasks.ToArray());
      switch (arg.Tipo)
      {
          case 2:
             Console.WriteLine(" *********** msg received"); //this is outputted twice
             tasks.Add(Task.Run(() => ShareMap(arg))); //this is called twice
             break;
             case 3: tasks.Add(Task.Run(() => ShareEvent(arg))); break;
             case 6: tasks.Add(Task.Run(() => ShareImage(arg))); break;
      }
    });
}

protected override void OnDisappearing()
{
   base.OnDisappearing();
   MessagingCenter.Unsubscribe<Page2, ParamType>(this, "PopUpData");
}

我在這里做錯了什么?

這有兩個可能的原因:

原因 1 - 消息被多次發送。 由於您堅持只發送一次,所以我將忽略這一點。 我仍然建議您在CompartilhaMapa function(發送者代碼)中放置一個斷點,以確保 function 實際上只被調用一次。

原因 2 - 您已多次訂閱該事件。 為了解決這個問題,

  1. 將訂閱事件放在 page1 的構造函數中,而不是放在 OnAppearing 中。
public Page1()
{
    ...
    MessagingCenter.Subscribe<Page2, ParamType>(this, "PopUpData", async (sender, arg) => ...

}
  1. 將取消訂閱事件放在 Page1 的析構函數中,而不是放在 OnDisappearing 中。 (您甚至可以將它放在 OnBackButtonPressed 覆蓋 function 而不是 Page1 中)
~Page1()
{
    ...
    MessagingCenter.Unsubscribe<Page2, ParamType>(this, "PopUpData")
}

我假設 Page1 是頁面的名稱,只需將其替換為實際名稱即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM