2017-01-28 6 views
0

アクティビティとフラグメント間の通信に問題なくEventBusを使用しましたが、2つのフラグメントで同じことをするのが疲れたとき、EventBusは特定のイベントのサブスクライバがないことを通知します。ここでFragmentAをサブスクライブするFragmentBからイベントを送信するサンプルの例である:2つのフラグメント間のEventBus通信。サブスクライバエラーなし

サンプルFragmentA(メッセージを受信しない受信機):

public class FragmentA extends Fragment { 

private View mView; 

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(int msg) {/* Do something */}; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mView = inflater.inflate(R.layout.a_fragment_layout, container, false); 
    EventBus.getDefault().register(this); 
    return mView; 
} 

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

サンプルFragmentB(送信者):

私が手
public class FragmentB extends Fragment { 

private View mView; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mView = inflater.inflate(R.layout.b_fragment_layout, container, false); 
    sendMessage(1); 
    return mView; 
} 

private void sendMessage(int msg){ 
    EventBus.getDefault().post(msg); 
} 
} 

エラー:

No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent 

問題はかなり単純なようですが、わかりません。

+2

問題は、あなたがイベント – Selvin

+1

簡単です...または登録する前にメッセージを送る... – MidasLefko

+0

を受ける前に、あなたはonStop打つしなければならない... FragmentAが登録されていない、 – Selvin

答えて

1

まあ、単純なモデルクラスを作成し、今度はNotifyEvent

public class NotifyEvent { 
    public int mValue; 

    public NotifyEvent(int value){ 
     this.mValue = value; 
    } 
} 

とそれを呼びましょう、送信と受信が

FragmentBで

のようにする必要があります:FragmentAで

private void sendMessage(int msg){ 
    EventBus.getDefault().post(new NotifyEvent(msg)); 
} 

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onMessageEvent(NotifyEvent event){ 
     int msg = event.mValue; 
     // do something with msg. 
} 

詳細はお問い合わせくださいhere

+0

彼はすでにそれをやっていて、コミュニケーションを断片化する活動に取り組んでいると書いています...だから、これがどのように彼を助けるだろうか? – Selvin

+2

@セルヴィン私は人々が話をする前に思ったり、何か行動したりして賢明なものと思うことをやめたいと思っています。 OP自身の答えをチェックしてください。 – Max

+0

なぜあなたは問題がプリミティブ型であるかという質問に書いていませんでしたか?私は確信が持てないので、チュートリアル – Selvin

0

私は自分の問題を把握しました。面白いことだが、では、intまたは別のプリミティブ型ではなくMessageEventオブジェクトを渡す必要があります

public class SomeObject { 
private int mTime; 

public SomeObject(int time){ 
    this.mTime = time; 
} 

public int getTime() { 
    return mTime; 
} 

public void setTime(int time) { 
    this.mTime = time; 
} 
} 

希望:代わりにPOJOの

EventBus.getDefault().post(9); 

例の

EventBus.getDefault().post(new SomeObject(9)); 

:私が行っていることは、単に代わりに生の整数の必要なパラメータを含んカスタムMessageEventのオブジェクトを掲示していますそれは誰かを助けるでしょう!

関連する問題