EventBus — класс, не распознающий аннотацию @Subscribe

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


ОШИБКА

java.lang.RuntimeException: Unable to start activity XXX/UserRegisterationActivity}: org.greenrobot.eventbus.EventBusException: 
       Subscriber class XXXX.UserRegisterationActivity and its super classes have no public methods with the @Subscribe annotation

   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2484)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2544)
   at android.app.ActivityThread.access$900(ActivityThread.java:150)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1394)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:168)
   at android.app.ActivityThread.main(ActivityThread.java:5845)
   at java.lang.reflect.Method.invoke(Native Method)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

Получение активности

public class UserRegisterationActivity extends BaseActivity {


  @Subscribe // I made sure to import greenroots's class not google's
    private void initRegistration(UserRegisteration reg) {

    switch (reg.getType()) {
      case 0: // register
        // do stuff
        break;

      case 1: // ticket
        // do other stuff
        break;
      default:
        break;
    }

  }

  @Override
  public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this); // crash occur here
  }

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


}

Класс событий

 public class UserRegisteration {

  private int type;
  private UserDetails mUserDetails ;

  public EventRegisteration(int type, UserDetails userDetails) {
    this.type = type;
    this.mUserDetails = userDetails;
  }

  public int getType() {
    return type;
  }

  public void setType(int type) {
    this.type = type;
  }

  public UserDetails getUserDetails() {
    return mUserDetails;
  }

  public void setUserDetails(UserDetails userDetails) {
    mUserDetails= userDetails;
  }

}

Активность публикации

    public class MainActivity extends BaseActivity {
    int type =0;
    UserDetails userData;
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initView();

    actionButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
          EventBus.getDefault().post(new UserRegisteration (type, userData));
          startActivity(new Intent(MainActivity.this, UserRegisterationActivity.class)); 
      }
      });

}

Некоторые предлагают добавить строку в ProGrad, чтобы он не удалял подписчиков и все такое. поэтому я добавил их, но все равно не работает

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

person Alaa AbuZarifa    schedule 20.01.2018    source источник


Ответы (1)


Ошибка говорит о том, что у вас нет общедоступных методов с аннотацией @Subscribe. И действительно, ваш метод является частным. Попробуйте сделать это публичным.

Также рассмотрите возможность использования Sticky Events.

person algrid    schedule 20.01.2018
comment
мой Бог! как я это пропустил! в любом случае большое спасибо за наводку. сбой теперь ушел, но у меня все еще есть странная проблема.! метод подписки вызывается.!? Я добавил туда тост, чтобы убедиться, и он не отображается..!? как вы думаете, в чем проблема? - person Alaa AbuZarifa; 21.01.2018
comment
Как я вижу в вашем коде, вы вызываете post до создания принимающей активности. Это не сработает, вы должны сначала создать UserRegisterationActivity, она должна вызывать register и только после этого вы можете вызывать post. - person algrid; 21.01.2018
comment
Я попробовал это, и это не сработало, но я просто устал от Sticky Events и работал как шарм. Спасибо, в любом случае. - person Alaa AbuZarifa; 21.01.2018