Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中使用事件总线库_Android_Android Studio_Event Bus - Fatal编程技术网

如何在android中使用事件总线库

如何在android中使用事件总线库,android,android-studio,event-bus,Android,Android Studio,Event Bus,我试图使用事件总线库,我无法理解它的功能并看到多个示例。是只使用服务类还是使用活动和片段?那么是使用活动在什么情况下我们在活动或片段中使用事件总线。我们可以简单地使用事件总线而不是接口。我们可以将消息从一个类传递到一个或多个类。EventBus分3步进行 定义 注册和注销 事后 定义事件: public static class MessageEvent { /* your getter and setter */ } 准备订阅服务器:声明并注释订阅方法,可以选择指定线程模式: @Su

我试图使用事件总线库,我无法理解它的功能并看到多个示例。是只使用服务类还是使用活动和片段?那么是使用活动在什么情况下我们在活动或片段中使用事件总线。

我们可以简单地使用事件总线而不是接口。我们可以将消息从一个类传递到一个或多个类。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上,活动和片段通常应根据其生命周期进行注册:

@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

可以将EnviBUS视为在活动、服务或片段或它们之间传递数据的轻量级通信通道。

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

EventBus工作的主要概念是,您订阅活动、片段或服务或任何类似组件中的事件,并且每当EventBus拥有您订阅的类型的特定事件时,它通知您在该组件中订阅的方法,您可以根据收到的事件在该组件中执行任何任务

触发事件很容易,您可以从应用程序的任何区域通过将特定事件(基本上是一个POJO类,比方说
MyEvent
)传递到EventBus来完成,而该总线将处理其余事件并将其正确地传递给相应的接收者

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


希望这有帮助。

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

事件的优点之一是你可以将对象传递到“某处”,而你不需要知道从何处获取它。这使得将活动或片段状态推送到控制器类,然后使用从该控制器发送回活动或片段的事件变得容易

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


我写了一篇文章,其中有一个非常具体的例子,介绍了如何使用事件来处理上述Android生命周期:

我们在什么情况下使用此事件而不是使用界面我们可以简单地使用事件它是只使用而不是使用界面每个好答案。但如果你给出使用示例,它会更容易理解。我只是理解概念,但我不知道你应该检查哪种情况下使用,所以要检查文档,还要检查链接。我认为这有点苛刻。Android的框架使得一些交互和耦合非常困难,EventBus有助于以合理的方式解决这些缺点。它不是解决所有问题的正确解决方案,如果您对它的使用不严格,您肯定会陷入混乱,但这并不意味着它是不可接受的,或者是您的体系结构有缺陷的自动信号。我在专业应用程序中使用了EventBus,但没有将其转换为意大利面代码。我认为这并不苛刻。滥用的比例:我看到的事件总线的实际需求约为10:1。如果我在代码中看到一个事件总线,我会将任何维护工作的时间估计翻一番。@Gabeschen所以基本上,你是说事件总线不应该存在。@DocatSearts我是说它们90%的使用不应该存在。偶尔也有有用的地方,但通常意味着程序中存在缺陷architecture@GabeSechan我真正想要的是为那些在决定是否尝试图书馆时遇到困难的人提供有用的讨论。我会让这些人决定我的论点是否可信。祝你好运。谢谢你的朋友。还有一个问题-如果用户从应用程序注销,那么这些值将从事件总线中删除,那么我们如何从事件总线中删除这些值