2016-11-09 59 views
0

我有一个使用MVP模式设计的应用程序。但有时我不确定我们所有的实现都坚持MVP最佳实践。尽管按照本书开展工作并不总是可行的,但我试图弄清楚哪些应该成为处理非用户交互的逻辑。MVP和非用户交互

例如:

我具有检测的垂直滚动RecyclerView的偏移。当滚动达到内容高度的20%(粗略)时,我应该弹出一个对话框。现在,我的逻辑将是(伪代码)

1. Presenter sets View.setVerticalOffsetTriggeringLimit(1000 pixels) 
2. View triggers view event and call Presenter.offsetForPopUpReached() 
3. Presenter triggers View.showPopUp() 
4. pop up is shown 

优点和缺点?有没有更好的方法,同时还有可测试的代码?系统本身是一个“用户”,应该使用演示者作为中间层?

回答

0

所有UI逻辑都属于View。演示者必须只有模型和视图之间的交互逻辑。重点是,该视图可能会有所不同 - 它可以是UI,也可以是某些模块,通过套接字发送命令。问题的关键在于,在两种情况下,“呈现逻辑” - 视图与数据交互保持不变,因此必须移入Presenter。弹出窗口,边距等是View实现细节。 方便的练习 - 将Presenter创建为单例,并将其注入到Activity中,然后实现View并将其连接到该View。 您可以通过EventBus发送来自演示者的事件(粘性事件)来消除模型。如果你这样做,事件将等待,直到活动收到它(metigate活动生命周期)。前一段时间我遇到过这种方法。

+0

嗯,我可以争辩。在按下按钮之后让演示者更新视图与滚动1000个像素并触发事件没有区别。无论如何,模型始终与视图分离。这完全是关于测试用例,并让Actor不一定是人,但应该平等对待UI的一部分。这种事件不仅仅是UI的东西,而是可能(或可能不)与模型相互作用的整个事件链。 – shadox

+1

是的,我想,你就在这里。尝试在这里使用'mediator' - 界面,用传递给View的RecyclerView抽象滚动事件及其实现。它可以替换为模拟测试。 –