Java 在MVP中,onClick是视图还是演示者的责任?
在MVP模式中,谁负责处理用户界面上的点击?Java 在MVP中,onClick是视图还是演示者的责任?,java,android,mvp,Java,Android,Mvp,在MVP模式中,谁负责处理用户界面上的点击? 例如,非MVP方法类似于: counterButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { totalClicks++; counterTextView.setText("Total clicks so far: "+totalClicks); } }); 使用MVP是onClick演讲
例如,非MVP方法类似于:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
totalClicks++;
counterTextView.setText("Total clicks so far: "+totalClicks);
}
});
使用MVP是onClick
演讲者的责任?或者视图
可以处理这个问题?有人能澄清一下吗?OnClick应该调用一个
演讲者
方法。您应该在presenter中完成业务,如果需要更新ui,您应该在视图中定义一个方法,并从presenter调用它
您需要一种方法来查看视图
ex:
public void showCounterCount(final int totalClicks){
counterTextView.setText("Total clicks so far: "+totalClicks);
}
您还需要在您的演示者中使用一个方法和一个变量
:
int totalClicks = 0;
public void onCounterButtonClicked(){
totalClicks++;
mView.showCounterCount(totalClicks);
}
然后像这样重构代码:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mPresenter.onCounterButtonClicked();
}
});
对于更复杂和干净的体系结构,您可以在interactors中完成用例业务。(在您的示例中,递增计数器值是应用程序的一个用例)
您可以定义一个interactior并在那里增加计数器值
反作用者:
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);
}
使用这种方法,您可以将业务逻辑与演示者完全分离,并在不复制演示者中的代码的情况下重新使用用例概念。这是一种更干净的方法
您还可以检查不同MVP方法的git回购。
祝你好运
编辑:
以下是我的轻量级wikipedia客户端项目来源:
我正在尝试实现MVP
。(MVP+Dagger2+RxJava)在MVP中,视图的责任是知道如何捕获点击,而不是决定对点击做什么。视图捕获单击后,必须调用演示者中的相关方法对其进行操作:
-------------------看法--------------------
button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));
------------------演讲者----------------
button1.setOnClickListener(new OnClickListener({
presenter.doWhenButton1isClicked();
}));
我有一系列关于android体系结构模式的文章,其中一篇是关于MVP的。您可能会发现它很有用。老实说,如果这是MVP方法,我并不认为它比原始代码片段有什么改进。我们刚刚添加了1个抽象/重定向,但好处何在?我们将应用程序分为三层,并将业务逻辑与ui分开。活动和片段是视图,只负责更新ui,只包含由演示者调用的接口方法。您的示例非常简单,因此很难看到好处,但在大型应用程序中,您可以更清楚地看到它。此外,它对ui测试也很有用。你可以查看这个链接。一个主要的好处是测试。在上面的示例中,您可以在Presenter中为onCounterButtonClicked()
方法编写单元测试,而不依赖于Android框架。这样的测试可以在JVM上运行。顺便说一句,我在Presenter方法名称中避免使用诸如按钮
和单击
之类的词,以减少它们与视图层概念的联系。如果我有4个按钮,我应该实现类似mPresenter.onclick(buttonView)或类似if(buttonView.getId()==logingButon.getId()的功能吗{mPresenter.onloginclick}else if(……)@JeCuRo很抱歉我的回答太晚了。我认为如果你的按钮执行完全不同的操作,你应该实现4种不同的presenter方法,并从视图调用它们。将android视图组件传递给presenter(按钮等)不适用于mvp,因为您的演示者必须独立于android sdk进行测试。如果它是recyclerview中的项目而不是按钮,该怎么办?将视图引用传递给演示者(如演示者)是否正确。onCardViewClick(cardView)?另外,当单击cardView时,如何处理新的意图?@Adi,不,您不需要将view元素传递给演示者。最终对任何view元素执行的任何操作都应由视图执行,那么演示者为什么应该访问它?因此,在您的情况下,您应该调用“presenter.onCardViewClick()”(无参数)。对于新的意图,您将onclick传递给演示者,如上所述,然后演示者在视图中调用一个方法,例如“view.goToNewActivity()”处理新意图的方式。因此,您执行意图的方式在视图内的方法中进行处理。在我的情况下,对于新意图,我需要从cardview中提取用户ID以显示用户配置文件。基本上,在card View上单击不会有相同的结果。我认为我需要做的最低要求是presenter。onCardViewClick(String userId)。但是,这感觉像是将业务逻辑放在视图中。您的想法是什么?@Adi,将用户ID或任何其他数据从视图传递给演示者,以执行业务需求,这是正确的方式,不同于在viewlayer中执行业务逻辑。例如,如果您希望在视图中通过用户ID获取用户配置文件,则已将逻辑放入视图中。但是,通过将用户ID传递给presenter,您不会执行任何业务逻辑。相反,presenter负责对该数据执行任何需要执行的操作。