1

我在我的 android 应用程序中使用了 greenrobot 的 EventBus,我非常喜欢它。

但是,现在我想通过使用演示者(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);
  }
}

这有意义吗?

或者从总线和复杂的片段生命周期中取消注册演示者甚至是危险的?

编辑:将总线注册移动到演示者本身(感谢 Nicklas)。

对这个架构还有更多的评论吗?

4

1 回答 1

4

你把太多的责任放在了视图上。您想要做的是让您的 Presenter 公开一个resume()andpause()方法,并在您的视图中调用它们。register()在这些方法中,您将unregister()EventBus.

这会将所有事件处理代码放在您的 Presenter 中。这也意味着您可以随时更改您在演示者中使用的事件机制,而无需更改视图中的一行代码。

在 MVP 中,您希望从 View 调用非视图相关方法的唯一对象是关联的 Presenters。

于 2015-04-25T12:17:14.413 回答