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

时间:2016-07-13 19:48:44

标签: java android mvp

在MVP模式中谁负责处理用户界面的点击?
例如。非MVP方法将类似于:

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

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

2 个答案:

答案 0 :(得分:30)

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

您需要一种适用于View ex:

的方法
public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}

您还需要Presenter中的方法和变量:

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}

并像这样重构您的代码:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });

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

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

CounterInteractor:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}

如下所示重构您的演示者:

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

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}

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

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

祝你好运。

编辑:

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

我正在尝试实施MVP。 (MVP + Dagger2 + RxJava)

答案 1 :(得分:4)

在MVP中, View 负责知道如何捕获点击,而不是决定如何对其进行操作。只要 View 捕获到点击,它就必须调用 Presenter 中的相关方法对其进行操作:

-------------------查看--------------------

button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));

------------------ Presenter ----------------

public void doWhenButton1isClicked(){
// do whatever business requires
}

我在android中有一系列关于架构模式的文章,其中part 3是关于MVP的。你可能会发现它很有帮助。