安卓MVP。谁关心从对话框和外部应用程序启动和获取数据?

j2e*_*esu 5 architecture mvp android

我喜欢 MVP 的概念,它对我组织代码有很大帮助,但是每次当我需要从外部应用程序、对话框或请求权限获取结果时,我都会遇到同样的问题 -架构的哪个组件应该关心这个?

例如,我们需要实现以下行为:

  • 点击按钮启动谷歌语音识别意图
  • 如果我们有多个结果 - 显示一个列表对话框并让用户选择正确的变体
  • 用它做事

所以,我们可以这样做(也决定 Fragment 实现 View,包含到 Presenter 的链接并向它发送 UI 事件):

interface View {

    void showRecognizer();//2

    void showChooseDialog(List<String> items);//4

}

interface Presenter {

    void onButtonClick();//1

    void onRecognizerResult(List<String> results);//3

    void onResultChosen(String result);//5

}
Run Code Online (Sandbox Code Playgroud)

好的,它会工作,但我们有一些问题:

  • 算法没有完全封装——如果你想改变它,你必须改变视图和演示者界面
  • 如果你在一个屏幕上有几个这样的算法,你的 V&P 界面会很大而且难以阅读和理解
  • 视图becames一点点聪明比它应该是(均为V&P知道约1,2,3,4,5的序列),演示者知道有关细节(对话是一个实现细节,但它要求视图启动它)
  • 算法不可重用!如何在其他屏幕上使用它?

所以,我想知道您对此的看法,如何做得更好(或者您认为这没问题)?

一般而言:启动对话和活动,请求权限,处理结果,从 MVP 和干净架构的角度来看,这是谁的职责?

鼓励任何想法或建议。请帮我澄清一下,谢谢。

Mar*_*jan 3

我对 MVP 的 5 美分:

有些事情在“视图”部分中是不可避免的,例如启动和收听某些服务(例如:谷歌地图或地点)。

在做类似的事情时,我尝试在 View 中保留尽可能少的逻辑,并通知 Presenter 任何交互(即使当时没有用),然后返回 View 所需的操作。

我的听众通常会触发演示者,而不是其他任何东西。然后演示者触发视图执行某些功能。这可能有点过分了,但我不想让我的演示者感到被排除在外。

在您的情况下,视图将启动一个对话框和/或权限请求,但演示者会命令它这样做。然后,当结果返回时,将它们交给 Presenter 来决定如何处理(只要你不传递视图等 Android 东西)。

希望这可以帮助。

  • 感谢您的建议。您认为结果应该以什么格式按原样(例如活动结果代码和意图数据)传回演示者,或者根据演示者的需要提取和修改? (2认同)