【问题标题】:How to use @Subscribe annotation on Xamarin.Forms Android platform using Greenrobot.EventBus package如何使用 Greenrobot.EventBus 包在 Xamarin.Forms Android 平台上使用 @Subscribe 注释
【发布时间】:2021-02-10 17:45:08
【问题描述】:

我正在尝试在 Xamarin 上实现 EventBus,但无法订阅事件,因为当我添加注释 @Subscribe() 时,我收到错误“@Subscribe 在当前上下文中不存在”。当我在没有@Subscribe 注释的情况下运行应用程序时,它向我显示一个错误,说“MainActivity 及其超类没有带有@Subscribe 注释的公共方法”。请帮助我了解如何在 Xamarin Android 平台上订阅事件

#MainActivity 类:

public class MainActivity : Activity
{
    protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            // Set our view from the "main" layout resource
           //Registering Event Bus here
            EventBus.Default.Register(this);
       
            SetContentView(Resource.Layout.activity_main);
        }
        
        @Subscribe //Showing me an error while adding this annotation
        public void OnEvent(NetworkInfo networkInfo)
        {
            Console.WriteLine(networkInfo);
        }

        protected void OnDestroy()
        {
            base.OnDestroy();
            EventBus.Default.Unregister(this);
        }
    }

PublisherEvent class:
public class PublishEvent 
    {
      public PublishEvent()
      { 
         EventBus.getDefault().post(message);
      }
    }

【问题讨论】:

    标签: android xamarin subscriber


    【解决方案1】:

    我不确定 Xamarin Forms 是否支持 EventBus,并且与原生 Android 一样使用 @Subscribe()

    但是,在 Xamarin Forms 中也有相同的方法。您可以使用 Xamarin.Forms MessagingCenter 来实现,它还可以订阅消息和接收消息。

    发送消息:

    MessagingCenter.Send<object>(this, "Hi");
    

    订阅留言:

    MessagingCenter.Subscribe<object> (this, "Hi", (sender) =>
    {
        // Do something whenever the "Hi" message is received
    });
    

    【讨论】:

    • 嗨,实际上我正在尝试在 aar(静态库)中建立 Xamarin 和 android 代码(Java)之间的通信。MessagingCenter 仅适用于 Xamarin。您知道 java 和 Xamarin 之间通信的其他替代方案吗?谢谢。
    • @ZahraW 如果你是binding an .AAR,它需要你从Java暴露方法,然后才能在它们之间进行通信。
    【解决方案2】:

    我能够通过 Xamarin 让 Subscribe 工作

    我注意到你的代码在这里

    @Subscribe //Showing me an error while adding this annotation
    public void OnEvent(NetworkInfo networkInfo)
    {
        Console.WriteLine(networkInfo);
    }
    

    是这样实现的吗? (注意使用属性而不是java注解)

    [Subscribe] 
    public void OnEvent(NetworkInfo networkInfo)
    {
        Console.WriteLine(networkInfo);
    }
    

    为了使其工作,Android 需要将 Subscribe 属性转换为 Java 中的 @Subscribe 注释。如果您正确设置了该项目,Xamarin 绑定库应该为您创建 SubscribeAttribute(尽管它可能明显缺少 ThreadMode 属性,但我可能很快就会为自己进行调查! )

    无论如何,如果OnEvent 方法没有在相应的Java 类中生成,则不会正确生成此属性。我发现这对我来说不会自动发生,所以我只需要在方法中添加 [Export]

    [Export]   
    [Subscribe] 
    public void OnEvent(NetworkInfo networkInfo)
    {
        Console.WriteLine(networkInfo);
    }
    

    这实际上(有点不明显)记录在 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 2018-03-02
      • 2019-03-17
      相关资源
      最近更新 更多