【问题标题】:Service (event bus subscriber) not receiving post from Activity服务(事件总线订阅者)未收到来自 Activity 的帖子
【发布时间】:2019-11-30 22:23:24
【问题描述】:

NotificationEvent 类 (POJO)

public class NotificationEvent {
LoggedInUserInterface liui;
public NotificationEvent(LoggedInUserInterface liui) {
    this.liui = liui;
}

}

MyFirebaseMessagingService(订阅者)

LoggedInUserInterface liui;
@Override
public void onCreate() {
    super.onCreate();
    EventBus.getDefault().register(this);
}

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

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onMessageEvent(NotificationEvent notificationEvent) {
    LoggedInUserInterface liui = notificationEvent.liui;
    this.liui = liui;
    Log.d("notifyUser", "EventBus call received in service");
}

我的活动(海报)

        EventBus.getDefault().postSticky(new NotificationEvent(this));
    Log.d("notifyUser", "Activity post call done");

错误

EventBus: No subscribers registered for event class com.myCompany.myApp.NotificationEvent
No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent

成功的日志

Activity post call done

不成功的日志

EventBus call received in service

我试过粘性和非粘性都无济于事。感谢您的帮助

更新

我可以确认事件总线工作正常,真正的问题是:服务仅在收到通知时运行。这是一个问题,因为该服务在每次创建活动时都需要来自主活动的更新字符串,而不是仅在收到通知时。

可能的黑客解决方案

我可以在每次启动应用程序时向自己发送一个通知(而不是显示它)。这将启动服务并允许事件总线更新字符串。这并不理想,并且会随着预算的增加而耗尽我的 Firebase 工资。因此,仍然会非常感谢本地解决方案。

【问题讨论】:

    标签: java android event-bus greenrobot-eventbus-3.0


    【解决方案1】:

    1st,记录firebase服务创建以确保它真正启动。 2,如果绿色作为 otto 你需要让服务在同一个进程中运行,否则它们将不会共享允许你在它们之间发布消息的资源(线程、内存堆栈)。

    最后,意图可能是一种更好/更可靠的从活动到服务的通信方式。

    【讨论】:

    • 我无法使用意图发送数据,因为我无法覆盖服务的 onStartCommand() - 这是最终方法。我在 onCreate() 中添加了日志:日志没有在 LogCat 中打印。我认为该服务仅在收到来自 firebase 的消息/通知时才会启动。
    • 现在这听起来很棘手 - 我现在无法使用计算机阅读文档。你最感兴趣的是什么,a) 知道什么时候发生了某事会采取行动,或者 b) 发送数据以便服务可以在它认为合适的时候使用它?传统上,您可以通过使用包含该数据的单例来解决 b,在某些情况下,将其称为 XyzRepository 是合适的。现在,如果您想要的是,请努力将该逻辑放在服务之外,这对我来说似乎是一种代码味道。
    • 理想情况下,我想将一个接口对象从活动发送到服务,使服务能够调用活动中的方法。至少我想将一个字符串从活动发送到服务。我对 B 更感兴趣。
    • 这里有两件事是活动不应该做的:1-保存值以便其他对象可以获取最新的值,以及 2-具有其他对象可以调用的方法。虽然 2 经常出于复杂的原因发生,但我认为这不是你的情况。我会这样做:一个运行逻辑的 XManager 类和一个存储数据的 XRepository。 Activity 将数据发送到 repo,repo 可选择将其写入 Shared Preferences。服务从从存储库读取的 X Manager 调用方法。它是一个更加灵活的架构,并且避免了特定于活动、服务和消息总线的问题。我希望这是有道理的。
    • 两个问题:什么是共享偏好?服务如何调用 X manager 中的方法?
    【解决方案2】:

    您可以尝试取消 Thread =Main srrbice 不应该在主线程上运行

    【讨论】:

    • 好点,我将线程模式更改为 POSTING - 默认值。请阅读问题中的更新,因为我已经缩小了问题范围。
    猜你喜欢
    • 2017-10-23
    • 2018-08-22
    • 1970-01-01
    • 2018-07-25
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多