在MVP模式中谁负责处理用户界面的点击?
例如。非MVP方法将类似于:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
totalClicks++;
counterTextView.setText("Total clicks so far: "+totalClicks);
}
});
使用MVP onClick
是Presenter
的责任吗?或者View
可以处理吗?
有人可以澄清一下吗?
答案 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的。你可能会发现它很有帮助。