我有一个单件服务类,它按照设定的时间表从服务器中提取数据。一旦客户收到数据,我就会触发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()
函数。
我无法理解这一点。将整个事物作为发布版本运行会有什么不同?是否有可能在另一个线程中发生的事情无法发布给我的订阅者?
有人能指出我正确的方向吗?提前致谢
答案 0 :(得分:14)
有可能您的发布版本是通过ProGuard运行的,并且它推断出由于订阅者方法没有直接调用,因此可以将它们安全地删除为未使用的代码。 Otto通过反射调用方法,ProGuard无法看到。
将以下内容添加到您的proguard配置文件中,以保留使用@Subscribe
或@Produce
注释的方法:
-keepattributes *Annotation*
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}