【问题标题】:Place for AlertDialog in Android app based on MVP architecture基于MVP架构的Android应用中AlertDialog的放置
【发布时间】:2016-01-08 10:09:05
【问题描述】:

谁能告诉我,根据 MVP 架构,我应该将 AlertDialogs 放在我的应用程序的哪个位置?我应该将它们留在我的活动中还是交给演示者?

【问题讨论】:

  • 为了更好地了解 P 上的内容和 V 上的内容,只需将您的演示者视为可以与不同实现(Android、Swing、JavaFX 等)共享的非 Android 模块。因此,原则上,答案是非常自我回答的:V.
  • @LyubomyrShaydariv 是的,谢谢。请把它作为答案,我会接受它

标签: android android-alertdialog mvp


【解决方案1】:

由于 MVP 不是一个特定的平台原则,它可用于编写与平台无关的应用程序。由于 M 和 P 很容易用纯 Java 编写(M 并不总是如此,但 P 几乎总是如此),V 实际上是目标平台的一个组件(例如 Swing、GWT、JavaFX、Android 甚至CLI [命令行界面])。假设您编写了这样一个跨平台应用程序,并且您有一个特定的视图 INotificationView,声明如下:

public interface INotificationView {

    void reportError(@Nonnull String errorMessage);

}

与平台无关的基础 P 不知道它在哪个平台上执行或应该在哪个平台上执行(至少在编译时),它只包含对 INotificationView 实例的引用。因此,您可以注入特定于平台的视图,例如:

public final class AndroidNotificationView
        extends Activity
        implements INotificationView {

    @Override
    public void reportError(@Nonnull final String errorMessage) {
        Toast.makeText(this, "ERROR: " errorMessage, Toast.LENGTH_LONG).show();
    }

}

请注意,这种方法允许您为演示者编写常规单元测试,因为它不再包含特定于平台的依赖项。还有一点,假设您将应用程序移植到 CLI,那么上面的接口可能实现如下:

public final class CliNotificationView
        implements INotificationView {

    @Override
    public void reportError(@Nonnull final String errorMessage) {
        System.err.print("ERROR: ");
        System.err.println(errormessage);
    }

}

与 Android 实现完全不同,对吧?这基本上就是 MVP 的意义所在。

另请注意,通知视图方法的名称未命名为displayErrorshowErrorshowAlertDisplay 只是因为视图界面没有规定如何将错误通知给一个用户——从 V 的角度来看,它仍然是错误报告

因此,您可以轻松地将 AlertDialog 放入您的视图实现中。

【讨论】:

  • 感谢您的详细解答。
  • 您将如何处理在用户确认错误后必须执行操作的情况?例如。在用户关闭对话框或按“任意键继续”后演示者必须关闭视图的不可恢复错误
  • @NicholasLythall 我只想在接受侦听器的reportError 方法中添加另一个参数,例如void reportError(@Nonnull String message, @Nonnull Runnable onAcknowledged)(或任何其他最符合您需求的侦听器类型)。然后,在演示者中:view.reportError("Unrecoverable error", view::shutdown);并在视图中:dialogBuilder.setPositiveButton("Acknowledge", (di, i) -> onAcknowledged.run()).
  • 嗨柳博米尔。非常翔实的答案。只是有一个小问题——在(自定义)对话框需要回调监听器的场景中,哪个实现它,V 还是 P?目前,我在 P 实现它的地方完成了它,并在创建对话框时传递了演示者(例如 CustomDialog(this, presenter)。这有意义吗?干杯!
猜你喜欢
  • 2018-04-21
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
相关资源
最近更新 更多