Подписчик не увольняется при использовании Otto

Я пробую Отто на Android и пытаюсь отправить сообщение из своего фрагмента в действие. Вот основы моего кода:

Мой поставщик автобусов:

public final class BusProvider {

 private static final Bus mInstance = new Bus();

 private BusProvider() {}

 public static Bus getBusProviderInstance() {
     return mInstance;
 }
}

Моя активность имеет следующий код:

public class MyActivity
        extends BaseActivity {

    // ....

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        BusProvider.getBusProviderInstance().register(this);
        // ....
    }

    @OnClick(R.id.profile_image)
    public void onImageClicked() {

        // ...

        MyFragment fragment = MyFragment.newInstance(choices);
        fragment.show(getFragmentManager(), "myChoices");
    }

    @Subscribe
    public void onButtonChoicePicked(MyFragment.ChoicePickedEvent event) {
        Toast.makeText(this, "reaching here", Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStop() {
        super.onStop();
        BusProvider.getBusProviderInstance().unregister(this);
    }

    // ...
}

и это важные фрагменты кода из моего фрагмента:

public class MyFragment
        extends BaseDialogFragment {

        // ...

        @Override
        public View onCreateView(LayoutInflater inflater,
                                 ViewGroup container,
                                 Bundle savedInstanceState) {

            LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.dialog_choices,
                                                                  container,
                                                                  false);
            setupDialogButtons(inflater, layout);
            return layout;
        }



    private void setupDialogButtons(LayoutInflater inflater, LinearLayout parentView) {
        ChoiceButtonViewHolder holder;

        holder = new ChoiceButtonViewHolder(inflater, parentView);
        holder.populateContent("First Choice", 1);

        parentView.addView(holder.mChoiceTextView);
    }


    class ChoiceButtonViewHolder {

        @InjectView(R.id.item_dialog_choice_desc) TextView mChoiceTextView;
        private int mPosition;

        ChoiceButtonViewHolder(LayoutInflater inflater, ViewGroup container) {
            TextView mChoiceTextView = (TextView) inflater.inflate(R.layout.item_dialog_choice, container, false);
            ButterKnife.inject(this, mChoiceTextView);
        }

        public void populateContent(String choiceDesc, int position) {
            mChoiceTextView.setText(choiceDesc);
            mPosition = position;
        }

        @OnClick(R.id.item_dialog_choice_desc)
        public void onChoiceClicked() {
            MyFragment.this.mDialog.dismiss();
            BusProvider.getBusProviderInstance().post(new ChoicePickedEvent(1));
        }
    }



    public static class ChoicePickedEvent {
        public int mPositionClicked;
        ChoicePickedEvent(int position) {
            mPositionClicked = position;
        }
    }
}

Я не получаю никаких ошибок. Но когда я нажимаю кнопку из фрагмента, событие onButtonChoicePicked не вызывается.

Я делаю что-то неправильно? Я неправильно понимаю, как работает Отто? Это странная комбинация ButterKnife и Otto, из-за которой он не работает?


person Kaushik Gopal    schedule 09.03.2014    source источник
comment
Вы использовали точку останова или зарегистрировали onChoiceClicked() из своего фрагмента, чтобы убедиться, что он выполняется?   -  person Bryan Dunlap    schedule 09.03.2014
comment
Эй, Брайан, да, когда я отлаживаю. Я достигаю onChoiceClicked, также вызывается getBusProviderInstance().post. Но после этого ничего не происходит. Диалог закрывается, но метод Activity не вызывается.   -  person Kaushik Gopal    schedule 09.03.2014
comment
Используется ли MyActivity напрямую или это родительский класс, от которого распространяются другие действия?   -  person Bryan Dunlap    schedule 09.03.2014
comment
MyActivity используется напрямую. Но он расширяет BaseActivity (как и фрагмент). Я исправил код, чтобы отразить это.   -  person Kaushik Gopal    schedule 09.03.2014
comment
Глядя на код, который вы разместили, я не вижу ничего неуместного. Другая моя мысль на данный момент заключается в том, что MyActivity каким-то образом непреднамеренно отменяется регистрация в Bus, но, похоже, это не так. Какой-нибудь код в вашем BaseActivity мешает регистрации?   -  person Bryan Dunlap    schedule 09.03.2014
comment
Спасибо Брайан. по прихоти я попробовал с EventBus GreenRobot, и это сработало. Так что я предполагаю, что это не имеет ничего общего с кодом. Ваш намек помог в том, что я заметил в некоторых других частях нашего кода, мы используем Dagger для внедрения Bus. Я предполагаю, что там происходит какой-то конфликт/столкновение. Надо будет разобраться в другой раз. Спасибо за помощь! Я не склонен выяснять, не лезет ли сейчас Даггер в мой конфиг. Но я отчитаюсь, если что.   -  person Kaushik Gopal    schedule 09.03.2014
comment
Рад был помочь, хоть и не сильно. Это была еще одна вещь, которая пришла мне в голову - разные экземпляры Bus - регистрация одного экземпляра в MyActivity и публикация в другом экземпляре в MyFragment. Но вы используете Bus здесь, используя BusProvider для создания синглтона, так что это тоже не так. Удачи.   -  person Bryan Dunlap    schedule 09.03.2014
comment
Есть ли причина, по которой вы не просто используете шину, которую вы уже предоставили через свой модуль Dagger? Это, наверное, путь.   -  person powerj1984    schedule 09.03.2014
comment
@ powerj1984 да, это было бы логичным следующим шагом для меня, но я хотел лучше понять, как работает шина событий с otto, поэтому экспериментировал с ней независимо на части проекта. Я все еще чувствую, что мой код выше должен работать, но я думаю, мне придется выяснить конфликтующие биты.   -  person Kaushik Gopal    schedule 14.03.2014
comment
Вы дважды проверили, что импорт подписки — это import com.squareup.otto.Subscribe;?   -  person jpardogo    schedule 18.08.2014
comment
спасибо @jpardogo, я добавил ответ на настоящую проблему.   -  person Kaushik Gopal    schedule 18.08.2014


Ответы (2)


Убедитесь, что вы импортируете «com.squareup.otto.Subscribe», а не «com.google.common.eventbus.Subscribe».

person Teimoor Alam Khan    schedule 12.01.2016

Код примера работает без проблем независимо. Причина, по которой я столкнулся с этой проблемой изначально (как было правильно указано @powerj1984): в моем проекте была неправильная конфигурация, где шина, которая вводилась (через Dagger), отличалась от экземпляра шины, на который подписывались для обновления: П.

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

person Kaushik Gopal    schedule 18.08.2014
comment
Та же проблема. Аннотация @Subscribe шины событий Гуавы вызывалась вместо аннотации Отто - person prometheuspk; 19.02.2015