Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在MVP中,onClick是视图还是演示者的责任?_Java_Android_Mvp - Fatal编程技术网

Java 在MVP中,onClick是视图还是演示者的责任?

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模式中,谁负责处理用户界面上的点击?
例如,非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负责对该数据执行任何需要执行的操作。