订阅者在使用Otto时不会被解雇

我在Android上尝试使用Otto,我试图将我的片段中的消息发送回活动。 这是我的代码的基础知识:

我的巴士提供商:

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奇怪的组合使它不起作用吗?

确保导入“com.squareup.otto.Subscribe”而不是“com.google.common.eventbus.Subscribe”

示例代码独立地工作没有任何问题。 我最初面临这个问题的原因(正如@ powerj1984正确指出的那样):我的项目中存在一个配置错误,正在注入的总线(通过Dagger)与正在订阅的总线实例不同更新:P。

获得的经验:确保您使用的总线在两种情况下都是相同的实例。