【问题标题】:otto eventbus for android behaves differently in release build用于 android 的 otto 事件总线在发布版本中表现不同
【发布时间】:2014-11-24 13:31:54
【问题描述】:

我有一个单例服务类,可以按照设定的时间表从服务器中提取数据。客户端一收到数据,我就触发bus.post(new NewServerResponseEvent()); (http://square.github.io/otto/)

然后在我的片段中我这样做:

@Override
public void onResume() {
    super.onResume();
    eventBus.register(this);
}

@Override
public void onPause() {
    super.onPause();
    eventBus.unregister(this);
}

@Subscribe
public void handleNewServerData(NewServerResponseEvent e) {
    refreshView();
}

只要我在我的测试设备上开发时运行它,一切都会非常顺利。一旦我构建了发布版本并将其放入 Play 商店,就永远不会调用 handleNewServerData() 函数。

我无法理解这一点。将整个事情作为发布版本运行有什么不同?是否可能在另一个线程中发生了无法发布给我的订阅者的事情?

有人能指出我正确的方向吗?

提前致谢

【问题讨论】:

    标签: android multithreading events event-bus otto


    【解决方案1】:

    很有可能您的发布版本是通过 ProGuard 运行的,并且它推断由于订阅者方法没有被直接调用,它们可以作为未使用的代码安全地删除。 Otto 通过反射调用方法,而 ProGuard 看不到。

    将以下内容添加到您的 proguard 配置文件中,以保留使用 @Subscribe@Produce 注释的方法:

    -keepattributes *Annotation*
    -keepclassmembers class ** {
        @com.squareup.otto.Subscribe public *;
        @com.squareup.otto.Produce public *;
    }
    

    【讨论】:

    • 天啊,他们甚至在他们的网站上提到过……我似乎完全跳过了几次。谢谢! ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    相关资源
    最近更新 更多