在基于 MVP 架构的 Android 应用程序中放置 AlertDialog

Place for AlertDialog in Android app based on MVP architecture

谁能告诉我,根据 MVP 架构,我应该将 AlertDialogs 放在应用程序的什么位置?我应该将它们留在我的 Activity 中还是放在演示者那里?

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

public interface INotificationView {

    void reportError(@Nonnull String errorMessage);

}

你的基础 platform-agnostic P 不知道它正在或应该在哪个平台上执行(至少在 compile-time 上),它只持有对 INotificationView实例。因此,您可以注入 platform-specific 视图,例如:

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();
    }

}

请注意,这种方法允许您为演示者编写常规单元测试,因为它不再具有 platform-specific 依赖性。还有一点,比方说,你将你的应用程序移植到 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 只是因为视图界面未指定 how 错误将被通知给用户 -- 从 V 的角度来看,它仍然以某种方式报告错误

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