6

我有一个单例服务类,可以按设定的时间表从服务器中提取数据。客户一收到数据,我就会触发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()就永远不会调用该函数。

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

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

提前致谢

4

1 回答 1

16

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

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

-keepattributes *Annotation*
-keepclassmembers class ** {
    @com.squareup.otto.Subscribe public *;
    @com.squareup.otto.Produce public *;
}
于 2014-11-24T13:42:18.230 回答