EventBus не запускается во фрагментах Android

Что я делаю:

У меня есть подписчик в MainActivity.Java

Я зарегистрировался в OnStart активности

@Override
    public void onCreate() {
        super.onCreate();
        //Register the event bus for the screen
        EventBus.getDefault().register(this);

    }


@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(BusCategories event) {
        //On Click of Categories Label

}

Затем у меня есть издатель в FragmentA, который

EventBus.getDefault().post(new BusCategories(mUploadProducts.getCategories()));

Итак, событие во Фрагменте вызывает вызовы в основном действии

  1. Это работает, но скажем, я перехожу в режим энергосбережения в телефоне, где срабатывает onPause, и возвращаюсь снова, подписчик никогда не срабатывает
  2. Как правильно с этим справиться

person Devrath    schedule 25.08.2017    source источник
comment
Я бы подписался не на onCreate, а на onStart или onResume и (соответственно) отписался бы на onStop или onPause (в зависимости от того, какой из них вы выберете).   -  person Martin Marconcini    schedule 26.08.2017
comment
@MartinMarconcini, как подписка на onStart или onResume решает здесь проблему?   -  person Ritesh    schedule 26.08.2017
comment
Пока мы не увидим, что делает OP в любом методе, невозможно сказать, учитывая объем предоставленной информации. Тем не менее, я бы по-прежнему следовал практике использования жизненного цикла по назначению. Не говоря уже о том, что я бы не стал использовать шину событий с самого начала…   -  person Martin Marconcini    schedule 26.08.2017
comment
При регистрации на OnStart.. действительно решает проблему... но зачем нам регистрироваться снова и снова... когда мы можем сделать это только один раз в onCreate   -  person Devrath    schedule 26.08.2017
comment
Ах… это тема для другого вопроса ;-)   -  person Martin Marconcini    schedule 26.08.2017
comment
@Devrath, когда ты отменял регистрацию раньше? в каком жизненном цикле?   -  person Ritesh    schedule 26.08.2017
comment
Я отменял регистрацию в OnDestroy активности   -  person Devrath    schedule 26.08.2017
comment
Странный..!! в этом случае он должен работать.   -  person Ritesh    schedule 26.08.2017
comment
@Ritesh ... Извините, я отменил регистрацию в OnStop .... в этом была проблема .... После отмены регистрации в OnDestroy ... все работает .... Лучше всего было бы OnCreate .. зарегистрируйтесь и отмените регистрацию OnDestroy :)   -  person Devrath    schedule 26.08.2017
comment
@Ritesh может послужить уроком, чтобы не ругать ответы, пока не будут получены все данные. Мой комментарий на самом деле решал проблему, потому что у меня была идея, что ОП делает именно то, что он делает. И все же вы ударили меня (по иронии судьбы), пытаясь казаться умным… остынь, это свободное пространство, и мы все пытаемся помочь. А теперь… вы, @devrath… «лучше всего было бы создавать/удалять» — это неправда. Это действительно зависит от того, особенно если у вас есть фрагменты… но если это работает для вас, хорошо. Это действительно зависит.   -  person Martin Marconcini    schedule 26.08.2017
comment
@MartinMarconcini Остынь, чувак..!! Посмотрите его код, он зарегистрировался в onCreate() и как это работает, если вы сделаете то же самое в onStart() или Stop(). Мне было любопытно, поэтому спросил, как это возможно. И вы должны были ответить тем же, а не ставить, поскольку это тема для другого вопроса. И да, onCreate() и onDestory() не лучшая практика, на самом деле это зависит от вашего варианта использования, обычно регистрация и отмена регистрации должны происходить в onStart() и onStop(). И я сделал правильно здесь..!!   -  person Ritesh    schedule 26.08.2017
comment
@Ritesh и Martin ... Спасибо, ребята ... Это обсуждение помогло мне лучше понять EventBus :)   -  person Devrath    schedule 26.08.2017


Ответы (2)


Вы должны обрабатывать регистрацию и отмену регистрации в методах onStart и onStop или в методах onResume и onPause соответственно.

person Aalap Patel    schedule 25.08.2017

В моем случае вам нужно сделать объект события обнуляемым, если вы используете Kotlin. Например :

//this will not tigger by eventbus  
@Subscribe
fun onEvent(message Short){

}


//but will trigger by event bus  
@Subscribe
fun onEvent(message Short?){

}
person sourav pandit    schedule 11.02.2021