问题描述
我正在尝试在 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);
}
}
解决方法
我不确定 Xamarin Forms 是否支持 EventBus,并且使用 @Subscribe()
与原生 Android 相同。
但是,在 Xamarin Forms 中也有相同的方式。您可以使用 Xamarin.Forms MessagingCenter 来实现这一点,它还可以订阅消息和接收消息。
发送消息:
MessagingCenter.Send<object>(this,"Hi");
订阅消息:
MessagingCenter.Subscribe<object> (this,"Hi",(sender) =>
{
// Do something whenever the "Hi" message is received
});
,
我能够通过 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