在MVP中是View或Presenter的onClick责任吗?

Jim*_*Jim 22 java mvp android

在MVP模式中谁负责处理用户界面的点击?
例如,非MVP方法将是这样的:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      totalClicks++;
      counterTextView.setText("Total clicks so far: "+totalClicks);
    }
  });
Run Code Online (Sandbox Code Playgroud)

使用MVP是onClick责任Presenter吗?或者View可以处理?
有人可以澄清一下吗?

sav*_*ion 31

OnClick应该调用一个Presenter方法.您应该在演示者中开展业务,如果您需要更新ui,则应在您的方法中定义一个方法View并从演示者处调用它.

你的View前任需要一个方法:

public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}
Run Code Online (Sandbox Code Playgroud)

你还需要一个方法和一个变量Presenter:

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}
Run Code Online (Sandbox Code Playgroud)

并像这样重构您的代码:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });
Run Code Online (Sandbox Code Playgroud)

对于更复杂和更干净的架构,您可以在交互器中执行用例业务.(在您的示例中,递增计数器值是您的应用程序的用例)

您可以定义一个交互器并在那里增加计数器值.

CounterInteractor:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}
Run Code Online (Sandbox Code Playgroud)

并重构您的主持人,如下所示:

int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以将业务逻辑与演示者完全分离,并重新使用您的用例概念,而无需在演示者中复制代码.这是更干净的方法.

你也可以检查这个git repo以获得不同的MVP方法. https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

祝好运.

编辑:

这是我的轻量级维基百科客户端项目源:https: //github.com/savepopulation/wikilight

我正在努力实施MVP.(MVP + Dagger2 + RxJava)

  • 一个主要的好处是测试.在上面的示例中,您可以在Presenter中为`onCounterButtonClicked()`方法编写单元测试,而不依赖于Android框架.此类测试可以在JVM上运行.顺便说一句,我在Presenter方法名称中避免使用诸如"button"和"click"之类的单词,以便将它们与View层的概念紧密联系起来 (5认同)
  • 我们将应用程序划分为三层,并将业务逻辑与ui分开.活动和片段是视图,只负责更新ui,只包含由演示者调用的接口方法.您的示例非常简单,因此很难看到好处,但在大型应用程序中,您可以更清楚地看到它.它对ui测试也很有用.你可以查看这个链接.http://antonioleiva.com/mvp-android/ (2认同)