2016-04-17 26 views
2

私はEventBusのAndroidの絶対的な基本実装を実装しようとしています。シンプルEventBus - 登録者がいません登録

activity 1でユーザが入力したコンテンツを簡単にしようとしていますが、その代わりに私はイベントバスを使ってオブジェクト全体を次のアクティビティに投稿しています - activity 2。 私は正確に与えられたガイドラインに従っています:

PART 1: POJO

public class StudentEvent { 

    public final String registrationNumber ; 
    public final String name ; 
    public final String course ; 
    public final String branch ; 

    public StudentEvent(String registrationNumber, String name, String course, String branch) { 
    this.registrationNumber = registrationNumber; 
    this.name = name; 
    this.course = course; 
    this.branch = branch; 
    } 

    public String getRegistrationNumber() { 
    return registrationNumber; 
    } 

    public String getName() { 
    return name; 
    } 

    public String getCourse() { 
    return course; 
    } 

    public String getBranch() { 
    return branch; 
    } 
} 

PART 2: Subscription in the second activity

EventBus.getDefault().register(this); //onCreate 

EventBus.getDefault().unregister(this); //onDestroy 

@Subscribe 
public void eventReceiver(StudentEvent studentEvent){ 
    tvRegistrationNumber.setText(studentEvent.getRegistrationNumber()); 
    tvName.setText(studentEvent.getName()); 
    tvBranch.setText(studentEvent.getBranch()); 
    tvCourse.setText(studentEvent.getCourse()); 
} 

PART 3: Post the event

StudentEvent studentEventObject = new StudentEvent(
      etRegistrationNumber.getText().toString(), 
      etName.getText().toString(), 
      etCourse.getText().toString(), 
      etBranch.getText().toString()) ; 

EventBus.getDefault().post(studentEventObject); 

私はエラーを取得:

D/EventBus: No subscribers registered for event class co.swisdev.abhinav.eventbustesting.StudentEvent 
D/EventBus: No subscribers registered for event class org.greenrobot.eventbus.SubscriberExceptionEvent 

私は何を失っていますか?
同じクラスでサブスクリプションを作成すると機能します。

答えて

6

これはタイミングの問題と思われます。イベント2を受け取るにはアクティビティ2を登録する必要があります。アクティビティ1からイベントを投稿する場合、アクティビティ2が作成されたという保証はありません。

+0

正解はなく、偉大な答えであることをもう少し肉付けする必要があります。 Activity Lifecycleを指し、これがリモートでもEventBusの正しいアプリケーションでない理由を説明することができます。 – 323go

+1

私がしなければならない最高の修正は何ですか? 私は意図を作ってEventBusにイベントを投稿すべきですか? @ 323go –

+0

@AbhinavJordiieDasこれは、EventBusが一般的に使用されているものではありません。一般に、EventBusは、既にアクティブなアクティビティまたはフラグメントの更新されたデータを受け取るために使用されます。 EventBusはオブザーバー/消費者の周りを包み込むものであると考えてください。 この例では、他のアクティビティにデータを渡すために使用しているようです。バンドルを使ったり、モデルに保存したり、アクティビティ2でモデルにアクセスしたりするのがよいでしょう。 –

3

これは答えではありませんが、これはEventBusユーザーに関係すると思います。 Per EventBus documentationは、我々はonStart()にEventBusに登録しEventBus.getDefaultを()入れない場合onStop()

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

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

に登録解除する必要があります(これ)を登録します。 onCreateへonイベントLisnetenersは、火をキャッチすることはできません。

activity.javaこの同じ問題を持っていた

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.act_fragment_layout); 

     EventBus.getDefault().register(this); 

    } 

    public void onEvent(AccountSelectedEvent event) { 
     FragTaxCustomsInfo frag = (FragTaxCustomsInfo) getSupportFragmentManager() 
       .findFragmentByTag(FragTaxCustomsInfo.TAG); 
     frag.paymentSelected(); 
    } 

    public void onEvent(AccountSelectedUpdateIndexEvent event) { 
     FragTaxCustomsInfo frag = (FragTaxCustomsInfo) getSupportFragmentManager() 
       .findFragmentByTag(FragTaxCustomsInfo.TAG); 
     frag.setSelectedPayment(event.getIndex(), false); 
    } 
1

、多分これは役立つかもしれません。 Activity2は、イベントを受け取るために完全に作成および登録されている必要があるため、これは@JesseBussの記述のタイミング問題です。しかし、Activity1からActivity2へのオブジェクトの転送を確実にする方法がありますが、もう少しコードが必要です。これを行うにはActivity2Activity1Activity1によって投稿されるイベントにサブスクライブし、Activity2によって投稿されるイベントにも購読する必要があります。例えば:

Activity1

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    EventBus.getDefault().register(this); //register here or onStart, etc 
} 

private void startActivity2(){//Start activity2 without any extras 
    //Intent Activity2 
    //startActivity(Activity2) 
} 


@Subscribe 
public void eventFromActivity2(String fromActivity2){ 
//subscribe to an event to be posted by activity2 (e.g a String). 
//At this point Activity2 should be fully created to respond to events from Activity1 

    StudentEvent studentEventObject = new StudentEvent(
      etRegistrationNumber.getText().toString(), 
      etName.getText().toString(), 
      etCourse.getText().toString(), 
      etBranch.getText().toString()) ; 

     EventBus.getDefault().post(studentEventObject);//post event back to Activity2 

     EventBus.getDefault().unregister(this);//unregister 

} 

Activity2

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    EventBus.getDefault().register(this);//register here 

    // after completing onCreate, post event to Activity1 
    EventBus.getDefault().post("to Activity1"); 
} 

protected void onDestroy() { 

    EventBus.getDefault().unregister(this); //unregister here 
    super.onDestroy(); 
} 

@Subscribe 
public void eventReceiver(StudentEvent studentEvent){ //respond to event from Activity1 
    tvRegistrationNumber.setText(studentEvent.getRegistrationNumber()); 
    tvName.setText(studentEvent.getName()); 
    tvBranch.setText(studentEvent.getBranch()); 
    tvCourse.setText(studentEvent.getCourse()); 
} 

はまた、あなたが "アクティビティ2" で@Subscribe(sticky = true)アノテーションを使用しようとすると、呼び出す必要があり、適切

0

イベントから登録を解除するようにしてください"活動1"のbus.postSticky(...)メソッド。

Documentation

関連する問題