Регистрация класса докладчика в EventBus (Android MVP)

Я использую EventBus от greenrobot в своих приложениях для Android, и мне это очень нравится.

Однако теперь я хотел бы отделить логику от своих фрагментов с помощью презентаторов (MVP).

Возможно ли следующее и полезно ли это?

Фрагмент:

public class MyFragment implements IMyFragment {

  IMyPresenter mPresenter;

  @Override
  public View onCreateView(...) {
    mPresenter = new MyPresenter(this);
  }

  @Override
  public void onResume() {
    // EventBus.getDefault().register(mPresenter); // register presenter to bus
    mPresenter.resume();
  }

  @Override
  public void onPause() {
    // EventBus.getDefault().unregister(mPresenter); // unregister presenter from bus
    mPresenter.pause();
  }

  @Override
  public void doSomething() { // gets called via presenter
    // ...
  }
}

Ведущий:

public class MyPresenter implements IMyPresenter {

  IMyFragment mFragment;

  // constructor to inject fragment
  public MyPresenter(IMyFragment mFragment) {
    this.mFragment = mFragment;
  }

  // handle event
  public void onEvent(SomeEvent event) {
    mFragment.doSomething();
  }

  public void resume() {
    EventBus.getDefault.register(this);
  }
  public void pause() {
    EventBus.getDefault.unregister(this);
  }
}

Имеет ли это смысл?

Или это даже опасно с точки зрения отмены регистрации докладчика в шине и сложного жизненного цикла фрагмента?

Редактировать: регистрация шины перемещена на самого докладчика (спасибо Никласу).

Есть еще комментарии по этой архитектуре?


person A2i_    schedule 22.04.2015    source источник


Ответы (1)


Вы возлагаете слишком большую ответственность на View. Вместо этого вы хотите, чтобы ваш Presenter выставлял методы resume() и pause() и вызывал их в своем представлении. В этих методах вы будете register() и unregister() на EventBus.

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

В MVP единственный объект, для которого вы хотите вызывать методы, не связанные с представлением, из представления, — это связанные презентаторы.

person Nicklas Jensen    schedule 25.04.2015
comment
Если вы также делегируете код жизненного цикла из действия, вы эффективно заменяете свое действие своим объектом-презентатором. Я думаю, что если вы применяете SRP, то Activity должен реализовать свой собственный код обработки жизненного цикла. - person drlobo; 05.06.2015