【问题标题】:How to use Event bus library in android如何在android中使用事件总线库
【发布时间】:2016-12-06 04:11:50
【问题描述】:

我正在尝试使用事件总线库,但我无法理解它的功能并查看多个示例。是只使用服务类还是使用活动和片段然后是使用活动我们在活动或片段中使用事件总线的情况。

【问题讨论】:

标签: android android-studio event-bus


【解决方案1】:

我们可以简单地使用 EventBus 来代替接口。我们可以将消息从一个类传递到一个或多个类。 EventBus 分 3 步

  • 定义
  • 注册和注销
  • 发布活动

定义事件:

public static class MessageEvent { /* your getter and setter */   }

准备订阅者:声明和注释您的订阅方法,可选择指定线程模式:

@Subscribe(threadMode = ThreadMode.MAIN)  
public void onMessageEvent(MessageEvent event) {
   /* event fire here when you post event from other class or fragment */
  };

注册和注销您的订阅者。例如在 Android 上,Activity 和 Fragment 通常应该根据它们的生命周期进行注册:

@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);//Register 
 }

取消注册

@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);//unregister
}

发布活动:

EventBus.getDefault().post(new MessageEvent());//post event

【讨论】:

  • 我们在什么情况下使用这个事件总线
  • 我们可以简单地使用Event来代替接口
  • 是否只使用 use 而不是 interface
  • 很好的答案。但是如果你给出使用例子会更容易理解
【解决方案2】:

您可以将 EventBus 视为一种轻量级的通信通道,用于在活动、服务、片段或它们之间传递数据。

将 EventBus 视为应用中的底层,它独立于任何活动的活动或服务或片段及其生命周期。

EventBus 工作的主要概念是您订阅活动、片段或服务或任何类似组件中的事件,并且只要 EventBus 有 输入您订阅的内容,它会在该组件中通知您订阅的方法,您可以根据收到的事件在那里执行任何任务。

触发事件很简单,您可以在应用程序的任何区域通过传递特定事件这基本上是一个 POJO 类,比方说@ 987654324@) 到 EventBus,总线将处理其余部分并正确地将其传递给适当的接收器。

我建议您试用 GreenRobot 的 EventBus 3,并在此处查看他们的文档以将他们的库合并到您的代码中。我一直在使用相同的,没有任何问题。

EventBus 3 by GreenRobot

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    大多数情况下你不应该这样做。一般来说,当您错误地构建程序并且由于您的应用程序的封装方式以及在什么级别上知道哪些对象而无法轻松地将数据从一个点传递到另一个点时,它是一种黑客攻击。它可能会导致真正的意大利面条代码,其中很难弄清楚事件发生时实际会调用什么代码。您不应该围绕拥有事件总线编写代码,如果您无法重构事情以正确地工作,它应该是最后的手段。

    【讨论】:

    • 我认为这有点苛刻。 Android 的框架使得一些交互和耦合变得非常困难,而 EventBus 则有助于以合理的方式处理这些缺点。它不是解决所有问题的正确解决方案,如果你不遵守它的使用规范,你肯定会陷入一团糟,但这并不意味着它是不可接受的,或者是你的架构存在缺陷的自动信号。我在专业应用程序中使用了 EventBus,而没有变成意大利面条代码。
    • 我认为这并不苛刻。我看到的事件总线的滥用:实际需要的比率约为 10:1。如果我在代码中看到事件总线,我会加倍估计任何维护工作的时间。
    • @GabeSechan 所以基本上,你是说 EventBus 不应该存在。
    • @docatseatbats 我是说 90% 的使用不应该。偶尔会有一些有用的地方,但通常意味着程序架构存在缺陷
    • @GabeSechan 我真正想要的只是提供对那些在决定是否尝试图书馆有困难的人有用的讨论。我会让这些人决定我是否有可信的论据。祝你工作顺利。
    【解决方案4】:

    事件的一个优点是您可以将对象传递到“某处”,而您无需知道它是从哪里拾取的。这可以很容易地将您的活动或片段状态推送到控制器类,然后使用从该控制器发送回活动或片段的事件。

    因为有事件,控制器不需要知道接收端是activity还是fragment。这使得将一个切换到另一个变得非常容易。另一方面,这也使得将控制器放在其他地方变得容易。就像首先将它作为应用程序类中的实例一样,然后将其移动到服务中。

    我写了一篇文章,其中包含一个非常具体的示例,说明如何使用事件来处理如上所述的 Android 生命周期:https://medium.com/@JuliusHuijnk/beating-the-android-life-cycle-d00a2f3ed88

    【讨论】:

    • 谢谢 buddy。还有一个问题 - 如果用户从应用程序中注销,那么这些值将从事件总线中删除,那么我们如何从事件总线中删除值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多