2014-11-24 5 views
4

У меня есть один класс обслуживания singleton, который извлекает данные с сервера по установленному расписанию. как только клиент получил данные, я вызвать bus.post(new NewServerResponseEvent()); (http://square.github.io/otto/)otto eventbus для android ведет себя по-разному в выпуске build

тогда в моих фрагментах я это сделать:

@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(); 
} 

все работает очень гладко до тех пор, как я просто запустить его при разработке на мой испытательное устройство. как только я создаю версию выпуска и помещаю ее в магазин воспроизведения, функция handleNewServerData() никогда не вызывается.

Я не могу понять из этого. что отличает ли это от запуска всего этого в качестве выпуска? может быть, что-то происходит в другом потоке, который не подходит для моего подписчика?

Может кто-нибудь указать мне в правильном направлении?

заранее спасибо

ответ

10

Скорее всего, что ваш релиз сборка проходит через ProGuard и делает вывод, что поскольку методы абонента не непосредственно называют, они могут быть безопасно удалены, как неиспользуемый код. Отто вызывает методы через отражение, и ProGuard этого не видит.

Добавьте следующие строки в файл конфигурации Proguard держать методы аннотированные с @Subscribe или @Produce:

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

OMG, они даже упоминать, что на их сайте ... я полностью пропустил, что несколько раз он, кажется. спасибо! ;) – stephanlindauer