在 Android 中使用事件总线与 Activity 生命周期方法和库实现
Using event bus in Android with Activity Lifecycle methods and library implementation
我正在尝试将事件总线添加到我的项目中,因为为了使代码更具可读性和应用程序健壮性,这是一个非常好的模式。
我需要听 Activity 生命周期方法。
让我解释一下为什么我需要这个。
我有 activity,在这个 activity 里面有 运行 个线程(或多个线程)与这个 activity 完全关联到主 UI 线程发布一些 UI 更改为主队列。
当 activity 将被销毁或暂停时,我需要暂停线程并在 activity 再次出现在屏幕上时恢复它。
当然我可以 pause/resume 直接在 onDestroy 和 onStart 方法中线程,但是还有一些其他组件也需要监听 activity 生命周期方法。
有我的问题:
在这种情况下使用 EventBus 是否正确,或者最好直接在 activity 生命周期方法中执行所有操作而不使用事件总线。在 activity 生命周期中使用事件总线是模棱两可且不正确的。
public class 示例Activity 扩展 Activity {
private EventBus bus = EventBus.getDefault();
private TextView view;
@Override
protected void onCreate(Bundle savedInstanceState) {
bus.register(this);
bus.post(new OnCreateEvent("Activity has been born"));
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
// Unregister
bus.post(new OnDestroyEvent("Activity is going to die"));
bus.unregister(this);
super.onDestroy();
}
}
我在这里看到的一个优势是,您不必在 activity 生命周期方法中每次您的部分 activity 需要时都添加一些逻辑。 Activity 内容可以很复杂,也可以使用片段,当然你也可以使用片段生命周期方法。但是不知道fragment会不会被销毁到activity生命周期方法被调用的时候,我还没有测试过。
所以这里的主要问题是使用本机钩子方法机制在这里做所需的事情还是使用事件总线更好。
下题与主题没有直接关系。问题是关于 EventBus
(EventBus Link) android 库的实现方式。
为什么不让侦听器 (bus.register(this);
) 实现接口,例如使用一种方法订阅 onEvent(BusEvent event);
。为什么不让这个方法接受一些基本的 class BusEvent
。在库实现中,每次发生事件和调用方法 onEvent
时都会使用反射。我看不出这种方法有任何优势,反射在 Java.
中是很重的事情
如果有任何答案或建议,我将不胜感激。
你可以这样做,如果你有多个线程监听多个 activities
,这将是一个很好的解决方案,但你需要传递 activity
或一些 id
添加到事件中,这样线程就会知道哪个 activity stopped/started。如果你只使用一个 activity 并且有处理它的线程那么我就不会使用 eventbus
。只有当我有多个订阅者并且来自代码中的不同位置时,我才使用 eventbus
,而不是在一个 activity
和几个线程的情况下。
实际上在浏览了源代码之后,我认为你是对的。但是我在某处读到他们很快就会发布 EventBus
3.0 版。现在找不到所以我希望不是我想象的:)。
它会更快更好,甚至可能像你提议的那样。
我正在尝试将事件总线添加到我的项目中,因为为了使代码更具可读性和应用程序健壮性,这是一个非常好的模式。
我需要听 Activity 生命周期方法。
让我解释一下为什么我需要这个。
我有 activity,在这个 activity 里面有 运行 个线程(或多个线程)与这个 activity 完全关联到主 UI 线程发布一些 UI 更改为主队列。
当 activity 将被销毁或暂停时,我需要暂停线程并在 activity 再次出现在屏幕上时恢复它。
当然我可以 pause/resume 直接在 onDestroy 和 onStart 方法中线程,但是还有一些其他组件也需要监听 activity 生命周期方法。
有我的问题:
在这种情况下使用 EventBus 是否正确,或者最好直接在 activity 生命周期方法中执行所有操作而不使用事件总线。在 activity 生命周期中使用事件总线是模棱两可且不正确的。
public class 示例Activity 扩展 Activity {
private EventBus bus = EventBus.getDefault(); private TextView view; @Override protected void onCreate(Bundle savedInstanceState) { bus.register(this); bus.post(new OnCreateEvent("Activity has been born")); super.onCreate(savedInstanceState); } @Override protected void onDestroy() { // Unregister bus.post(new OnDestroyEvent("Activity is going to die")); bus.unregister(this); super.onDestroy(); }
} 我在这里看到的一个优势是,您不必在 activity 生命周期方法中每次您的部分 activity 需要时都添加一些逻辑。 Activity 内容可以很复杂,也可以使用片段,当然你也可以使用片段生命周期方法。但是不知道fragment会不会被销毁到activity生命周期方法被调用的时候,我还没有测试过。 所以这里的主要问题是使用本机钩子方法机制在这里做所需的事情还是使用事件总线更好。
下题与主题没有直接关系。问题是关于
EventBus
(EventBus Link) android 库的实现方式。 为什么不让侦听器 (bus.register(this);
) 实现接口,例如使用一种方法订阅onEvent(BusEvent event);
。为什么不让这个方法接受一些基本的 classBusEvent
。在库实现中,每次发生事件和调用方法onEvent
时都会使用反射。我看不出这种方法有任何优势,反射在 Java. 中是很重的事情
如果有任何答案或建议,我将不胜感激。
你可以这样做,如果你有多个线程监听多个
activities
,这将是一个很好的解决方案,但你需要传递activity
或一些id
添加到事件中,这样线程就会知道哪个 activity stopped/started。如果你只使用一个 activity 并且有处理它的线程那么我就不会使用eventbus
。只有当我有多个订阅者并且来自代码中的不同位置时,我才使用eventbus
,而不是在一个activity
和几个线程的情况下。实际上在浏览了源代码之后,我认为你是对的。但是我在某处读到他们很快就会发布
EventBus
3.0 版。现在找不到所以我希望不是我想象的:)。 它会更快更好,甚至可能像你提议的那样。