Как использовать шину событий Otto с аннотациями Android

Я работаю над приложением, в котором хочу использовать Аннотации Android и Событие Otto Bus от Square

Для интеграции этих двух библиотек я перешел по этой ссылке здесь. Также я использовал предложенную там библиотеку Otto 2.0-wip, а не ту, что из Otto Git.

Вот как я делаю реализацию:

Я создал одноэлементный класс для автобуса:

@EBean(scope = EBean.Scope.Singleton)
public class BusProviderAA extends BasicBus{
}

Я объявляю объект для этого класса внутри my Fragment Class, где я хочу subscribe на событиях:

@Bean
BusProviderAA ottoBus;

@AfterInject
protected void initAfterInjectMFragment() 
     .... // my stuff here
    ottoBus.register(this);
}

@Override
public void onStop() {
    super.onStop();
    ottoBus.unregister(this);
}

@Subscribe
public void onChangeUserDetailsEvent(ChangeUserDetailsEvent mEvent){
    Log.e(" s onChangeUserDetailsEvent", "ss onChangeUserDetailsEvent");

    if(mEvent.msg.contains("Data_changed")){
        //TODO 
    }

}

Я отправляю событие в шину из my communicator class, когда оно получает callback от связи с сервером. Вот как я post event к своему автобусу внутри этого класса:

@Bean //To use this enhanced class in another enhanced class or in an enhanced Android component, use @Bean:
BusProviderAA ottoBus;

public void callbackResponse(....){
....// my stuff here and after callback
ottoBus.post(changeUserDetailsEvent(serverResponse.getMsg()));
}

@Produce
public ChangeUserDetailsEvent changeUserDetailsEvent(String msg){
    return new ChangeUserDetailsEvent(msg);
}

А это мой ChangeUserDetailsEvent класс:

public class ChangeUserDetailsEvent {

   public final String msg;

   public ChangeUserDetailsEvent(String msg) {
       this.msg = msg;
   }
}

Проблема. Моя проблема в том, что мой метод, который подписан на событие шины onChangeUserDetailsEvent, не вызывается, и я даже не знаю, как отладить, чтобы решить эту проблему.

Я должен упомянуть, что событие шины отлично работает, когда я реализую его в Fragment, который не использует аннотации, и в синглтоне Bus без аннотаций. Это одноэлементный класс Bus, когда я не использую аннотации:

public class BusProvider {

   private static final Bus BUS = new BasicBus(); // me lib

   public static Bus getInstance(){
       return BUS;
   }

   private BusProvider(){}
}

Спасибо!

ИЗМЕНИТЬ

У меня также есть проблема, когда я обновляюсь до androidannotations:3.2, меняя свой gradle file с:

compile 'org.androidannotations:androidannotations:3.1' apt 'org.androidannotations:androidannotations:3.1'

to:

compile 'org.androidannotations:androidannotations:3.2' apt 'org.androidannotations:androidannotations:3.2'.

Для версии 3.1 компилируется, но не работает otto event bus. С версией 3.2 выдает ошибку. Это означает, что в библиотеку АА внесены какие-то изменения, которые мне нужно реализовать, или в ней есть ошибки. Как я могу найти решение?

Это одна из ошибок (для демонстрации): Ошибка: (27, 25) ошибка: не удается найти класс символов UserAccountActivity_, который является классом активности.

Это мой androidannotations.log:

17:26:05.187 [Daemon Thread 13] INFO  o.a.AndroidAnnotationProcessor:84 - Initialize AndroidAnnotations 3.2 with options {androidManifestFile=C:\Users\Armando\Android Studio\Hu\app\build\intermediates\manifests\full\debug\AndroidManifest.xml, resourcePackageName=XXPack}
17:26:05.244 [Daemon Thread 13] INFO  o.a.AndroidAnnotationProcessor:108 - Start processing for 15 annotations on 100 elements
17:26:05.273 [Daemon Thread 13] DEBUG o.a.h.AndroidManifestFinder:98 - AndroidManifest.xml file found with specified path: C:\Users\Armando\Android Studio\Hu\app\build\intermediates\manifests\full\debug\AndroidManifest.xml
17:26:05.279 [Daemon Thread 13] INFO  o.a.AndroidAnnotationProcessor:171 - AndroidManifest.xml found: AndroidManifest [applicationPackage=XXPack, componentQualifiedNames=[XXPack.SplashScreen, XXPack.HomeActivity, XXPack.ActivityProve, XXPack.UserAccountActivity_, XXPack.CartActivity_, com.facebook.LoginActivity], permissionQualifiedNames=[android.permission.INTERNET, android.permission.READ_EXTERNAL_STORAGE, android.permission.write_external_storage], applicationClassName=null, libraryProject=false, debugabble=false, minSdkVersion=14, maxSdkVersion=-1, targetSdkVersion=21]
17:26:05.280 [Daemon Thread 13] INFO  o.a.r.ProjectRClassFinder:50 - Found project R class: XXPack.R
17:26:05.286 [Daemon Thread 13] INFO  o.a.r.AndroidRClassFinder:44 - Found Android class: android.R
17:26:05.304 [Daemon Thread 13] INFO  o.a.p.ModelValidator:42 - Validating elements
17:26:05.304 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with EActivityHandler: [XXPack.CartActivity, XXPack.UserAccountActivity]
17:26:05.306 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with EFragmentHandler: [XXPack.fragments.AddAddressFragment, XXPack.fragments.AddressBookFragment, XXPack.fragments.ChangePasswordFragment, XXPack.fragments.MyOrdersFragment, XXPack.fragments.MyVouchersFragment, XXPack.fragments.NewsLetterFragment, XXPack.fragments.PaymentMethodFragment, XXPack.fragments.PersonalDataFragment, XXPack.fragments.UserAccountFragment]
17:26:05.308 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with EBeanHandler: [XXPack.bus.BusProviderAA, XXPack.communicator.UserAccountCommunicator]
17:26:05.308 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with EViewGroupHandler: [XXPack.layouts.AddressBookItem, XXPack.layouts.CartItem, XXPack.layouts.OrdersItem, XXPack.layouts.UserAccountListFooter, XXPack.layouts.UserAccountListHeader]
17:26:05.319 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with ItemClickHandler: [lv_user_account(int)]
17:26:05.321 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with OptionsMenuHandler: [XXPack.fragments.UserAccountFragment]
17:26:05.323 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with BeanHandler: [ottoBus, ottoBus, communicator]
17:26:05.324 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with ProduceHandler: [produceNonceEvent(XXPack.models.Nonce), produceErrorEvent(XXPack.models.ErrorCommunication), produceFeatureCategoryEvent(java.util.ArrayList<XXPack.models.SimpleCategory>), produceErrorEvent(XXPack.models.ErrorCommunication), produceProductEvent(java.util.ArrayList<XXPack.models.Product>), produceErrorEvent(XXPack.models.ErrorCommunication), changeUserDetailsEvent(java.lang.String), produceErrorEvent(XXPack.models.ErrorCommunication), produceUserEvent(XXPack.models.User), produceErrorEvent(XXPack.models.ErrorCommunication)]
17:26:05.325 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.325 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.325 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.325 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.326 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.326 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.326 [Daemon Thread 13] ERROR o.a.h.AnnotationHelper:126 - @com.squareup.otto.Produce can only be used on a method with zero parameter, instead of 1
17:26:05.327 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.327 [Daemon Thread 13] ERROR o.a.h.AnnotationHelper:126 - @com.squareup.otto.Produce can only be used on a method with zero parameter, instead of 1
17:26:05.327 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.327 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element ProduceHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with SubscribeHandler: [onNonceEvent(XXPack.event.NonceEvent), onErrorEvent(XXPack.event.ErrorEvent), onFeaturesAndCategory(XXPack.event.FeatureCategoryEvent), onNonceEvent(XXPack.event.NonceEvent), onErrorEvent(XXPack.event.ErrorEvent), onUserEvent(XXPack.event.UserEvent), onChangeUserDetailsEvent(XXPack.event.ChangeUserDetailsEvent)]
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] WARN  o.a.p.ModelValidator:69 - Element SubscribeHandler unvalidated by 
17:26:05.328 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with AfterInjectHandler: [initAfterInjectCart(), initAfterInjectAddAddress(), initAfterInjectAddressBook(), initAfterInjectChangePass(), initAfterInjectAddressBook(), initAfterInjectPersonalData()]
17:26:05.328 [Daemon Thread 13] DEBUG o.a.p.ModelValidator:62 - Validating with AfterViewsHandler: [initAfterViewsCart(), initUserAccountAct(), initAddAddressFragment(), initAddressFragment(), initChangePassFragment(), initMyOrdersFragment(), initMyVoucherFragment(), initNewsLetterFragment(), initPaymentFragment(), initViewsAfterViews(), initUserAccountFragment()]
17:26:05.333 [Daemon Thread 13] INFO  o.a.p.ModelProcessor:69 - Processing root elements
17:26:05.338 [Daemon Thread 13] DEBUG o.a.p.ModelProcessor:160 - Processing root elements EActivityHandler: [XXPack.UserAccountActivity, XXPack.CartActivity]
17:26:05.353 [Daemon Thread 13] DEBUG o.a.p.ModelProcessor:160 - Processing root elements EFragmentHandler: [XXPack.fragments.AddressBookFragment, XXPack.fragments.AddAddressFragment, XXPack.fragments.NewsLetterFragment, XXPack.fragments.MyOrdersFragment, XXPack.fragments.UserAccountFragment, XXPack.fragments.PaymentMethodFragment, XXPack.fragments.PersonalDataFragment, XXPack.fragments.ChangePasswordFragment, XXPack.fragments.MyVouchersFragment]
17:26:05.358 [Daemon Thread 13] DEBUG o.a.p.ModelProcessor:160 - Processing root elements EBeanHandler: [XXPack.bus.BusProviderAA, XXPack.communicator.UserAccountCommunicator]
17:26:05.358 [Daemon Thread 13] DEBUG o.a.p.ModelProcessor:160 - Processing root elements EViewGroupHandler: [XXPack.layouts.CartItem, XXPack.layouts.UserAccountListFooter, XXPack.layouts.OrdersItem, XXPack.layouts.AddressBookItem, XXPack.layouts.UserAccountListHeader]
17:26:05.363 [Daemon Thread 13] INFO  o.a.p.ModelProcessor:77 - Processing enclosed elements
17:26:05.368 [Daemon Thread 13] INFO  o.a.AndroidAnnotationProcessor:250 - Number of files generated by AndroidAnnotations: 18
17:26:05.368 [Daemon Thread 13] INFO  o.a.g.ApiCodeGenerator:52 - Writting following API classes in project: []
17:26:05.373 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.bus.BusProviderAA_
17:26:05.388 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.layouts.AddressBookItem_
17:26:05.456 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.layouts.CartItem_
17:26:05.468 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.layouts.OrdersItem_
17:26:05.480 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.layouts.UserAccountListFooter_
17:26:05.491 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.layouts.UserAccountListHeader_
17:26:05.500 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.CartActivity_
17:26:05.514 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.UserAccountActivity_
17:26:05.529 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.AddAddressFragment_
17:26:05.546 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.AddressBookFragment_
17:26:05.559 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.ChangePasswordFragment_
17:26:05.587 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.MyOrdersFragment_
17:26:05.600 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.MyVouchersFragment_
17:26:05.613 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.NewsLetterFragment_
17:26:05.624 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.PaymentMethodFragment_
17:26:05.634 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.PersonalDataFragment_
17:26:05.649 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.fragments.UserAccountFragment_
17:26:05.664 [Daemon Thread 13] DEBUG o.a.g.SourceCodewriter:55 - Generating class: XXPack.communicator.UserAccountCommunicator_
17:26:05.670 [Daemon Thread 13] INFO  o.a.p.TimeStats:81 - Time measurements: [Whole Processing = 426 ms], [Generate Sources = 302 ms], [Process Annotations = 40 ms], [Extract Annotations = 27 ms], [Validate Annotations = 25 ms], [Find R Classes = 18 ms], [Extract Manifest = 6 ms], 
17:26:05.671 [Daemon Thread 13] INFO  o.a.AndroidAnnotationProcessor:122 - Finish processing

person Ultimo_m    schedule 11.11.2014    source источник
comment
Какая у вас версия АА? У нас была проблема с этим в 3.1, которую мы исправили в 3.2.   -  person WonderCsabo    schedule 11.11.2014
comment
Извините, я вижу, вы используете ветку wip. При этом приведенный выше код должен работать даже с 3.1. Хотя эта ветка не поддерживается, поэтому я предлагаю перейти на стабильную версию Otto и AndroidAnnotations 3.2. Или с помощью greenrobot Eventbus, который может пройти по иерархии классов.   -  person WonderCsabo    schedule 12.11.2014
comment
Я пытался перейти на Otto 1.3.5 и AndroidAnnotations 3.2, но есть проблема, и это происходит, когда я меняю: compile 'org.androidannotations:androidannotations:3.1' apt 'org.androidannotations:androidannotations:3.1'   -  person Ultimo_m    schedule 12.11.2014
comment
Какая у вас проблема. Пожалуйста, скопируйте сообщение об ошибке...   -  person WonderCsabo    schedule 12.11.2014
comment
Пожалуйста, проверьте мой отредактированный ответ...   -  person Ultimo_m    schedule 12.11.2014
comment
У вас ошибка: ERROR o.a.h.AnnotationHelper:126 - @com.squareup.otto.Produce can only be used on a method with zero parameter, instead of 1. Вот почему класс не был сгенерирован, поэтому его нельзя найти.   -  person WonderCsabo    schedule 12.11.2014
comment
Но мой вопрос: почему это работает, когда у меня есть: compile 'org.androidannotations:androidannotations:3.1' apt 'org.androidannotations:androidannotations:3.1', и не работает, когда у меня есть: compile 'org.androidannotations:androidannotations:3.2' apt 'org.androidannotations:androidannotations:3.2'. Это означает, что в библиотеку AA внесены какие-то изменения, которые мне нужно реализовать, или в ней есть ошибки. Как я могу найти решение?   -  person Ultimo_m    schedule 13.11.2014
comment
В AA 3.1 была ошибка, она вообще не обрабатывает аннотации Отто. Вот почему вы не видите ошибки с этим. Решение фактически выводится в консоль: вы должны удалить параметр из метода, аннотированного Produce.   -  person WonderCsabo    schedule 13.11.2014
comment
Я добавил больше деталей в свой ответ.   -  person WonderCsabo    schedule 13.11.2014


Ответы (1)


В AndroidAnnotations 3.1 была ошибка: он не обрабатывал аннотации Produce и Subscribe. В AA 3.2 я исправил эту проблему.

Вы можете спросить, почему АА вообще должен обрабатывать эти аннотации? К сожалению, Отто не может читать аннотации родительских классов. Но с AA вы всегда используете сгенерированный подкласс. Это означает, что когда Otto обрабатывает сгенерированный подкласс, он не находит никаких аннотаций Otto, поэтому ваш метод обработчика событий не вызывается. Чтобы обойти эту проблему, мы добавили два обработчика аннотаций, которые обрабатывают Subscribe и Produce. Эти обработчики только переопределяют метод в сгенерированном классе и копируют аннотации Отто в эти методы. Таким образом, Отто сможет прочитать аннотации в сгенерированном классе.

Например:

@EActivity(R.layout.activity_my)
class MyActivity extends Activity{

  @Produce
  public Event produce() {
    return ...; // create the event
  }

}

class MyActivity_ extends MyActivity {

  ...

  @Produce
  @Override
  public Event produce() {
    return super.produce();
  }
}

@Produceannotated не может иметь никаких аргументов, так как Otto не может понять, что вы хотите передать ему, когда он вызывает метод (Otto документ).

person WonderCsabo    schedule 13.11.2014
comment
Спасибо, чувак, я рад видеть, что Otto Bus правильно работает с AA :) - person Ultimo_m; 13.11.2014
comment
Добро пожаловать. Вас могут заинтересовать планы на будущее для шин событий и AA. - person WonderCsabo; 13.11.2014
comment
@WonderCsabo Я нахожусь в похожей ситуации, но получаю сообщение о том, что производитель уже зарегистрирован, хотя я примерно на 99,9% уверен, что звоню зарегистрироваться только один раз! Должен ли я зарегистрировать проблему на GH для этого? Не вижу ничего, что я делаю, что может вызвать это! Недавно обновился до AA 3.3.2. - person Norman H; 20.08.2015
comment
Я обнаружил, что напортачил что-то локально. В моем проекте было две противоречивые ссылки на Отто. Теперь все хорошо. - person Norman H; 24.08.2015