2014-11-24 5 views
4

나는 서버에서 일정에 따라 데이터를 가져 오는 싱글 톤 서비스 클래스를 가지고 있습니다. 클라이언트가 데이터를 수신하자마자, 나는이 이렇게 내 조각에서 다음 안드로이드에 대한 otto eventbus는 릴리스 빌드에서 다르게 동작합니다.

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

모든 것이 매우 원활 같은 시간에 개발하는 동안 난 그냥 그것을 실행으로 작동을 내 테스트 장치. 최대한 빨리 릴리스 버전을 빌드하고 플레이 스토어에 넣으면 해당 함수는 호출되지 않습니다. handleNewServerData()

나는 이것을 이해할 수 없다. 그 모든 것을 릴리스 빌드로 실행하려면 differnce가 무엇입니까? 구독자에게 게시 할 수없는 다른 스레드에서 일어나는 일이 있을까요?

누군가 나를 올바른 방향으로 안내 할 수 있습니까?

덕분에 사전에

답변

10

기회는 당신의 릴리스 빌드가 ProGuard를 통해 실행되는 것을하고는 가입자 방법은 직접 호출되지 않기 때문에, 그들은 안전하지 않은 코드로 제거 할 수 있음을 추론한다. Otto는 리플렉션을 통해 메소드를 호출하고 ProGuard는이를 볼 수 없습니다.

@Subscribe 또는 @Produce 주석 방법을 유지하기 위해 난독 설정 파일에 다음을 추가

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

세상에, 그들은 심지어 내가 완전히 보이는 몇 배 스킵 ... 자신의 웹 사이트에 을 그 언급. 덕분에 ! ;) – stephanlindauer