5

Android用EventBus Libraryの絶対基本実装を実装しようとしています。

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

パート 1: ポジョ

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;
  }
}

パート 2: 2 番目のアクティビティでのサブスクリプション

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());
}

パート 3: イベントを投稿する

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

何が足りないの?
同じクラスでサブスクリプションを作成すると機能します。

4

6 に答える 6

13

これは答えではありませんが、これは EventBus ユーザーに関係があると思います。EventBus のドキュメントonStart()に従って、EventBus に登録し、登録を解除する必要があります。onStop()

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

@Override
public void onStop() {
   EventBus.getDefault().unregister(this);
    super.onStop();
}
于 2016-07-09T09:23:57.857 に答える
11

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

于 2016-04-17T05:20:45.573 に答える
1

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

アクティビティ1

 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

}

アクティビティ2

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());
}

また、イベントからの登録は適切に解除してください

于 2018-02-14T11:20:47.107 に答える
0

入れない場合 EventBus.getDefault().register(this); onCreateに。onEvent リスナーは発火できません。

アクティビティ.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);
    }
于 2017-11-03T06:28:42.073 に答える