Android MVP(存储库模式)获得 Camera/Gallery 图片?

Android MVP (Repository pattern) get Camera/Gallery Image?

我正在尝试使用 google sample code for mvp 实现 MVP 架构。我有一个 activity 作为具有演示者和模型的视图。单击按钮,用户可以捕获图像并将其保存在外部存储器中。在捕获点击时,我还需要播放声音。

我不确定应该将哪个代码放在哪个 class 中,因为我无法将相机捕获和播放声音代码放在 Activity 中(我将其视为视图)以保持视图是哑的尽可能,我不能把代码放在 Presenter 中,因为它使用 Android 框架 classes(上下文等)。

所以,唯一的选择是将它放在模型中,但在示例代码中,模型只有存储库(我认为这仅与数据源相关local/remote)。

如何将此代码放入模型中以及如何 link 将其与其他组件(如 View 和 Presenter)一起使用?有什么指导方针吗?

这是解决此类问题的一种方法。

你的问题是有些代码对于进入演示者来说是有意义的,但是它太 Androidy 了,所以你可以简单地 interface 围绕它。

你基本上需要的是两个可以完成某些功能的东西。

interface CapturingSoundPlayer {
    void playSound();
}

interface ImageCapturer {
    void captureImage();
}

请注意,名称和方法签名取决于您和您的需要,我只是用它们来说明问题。

现在,您的应用程序将这两个接口作为依赖项是绝对安全的,它们与 Android 无关,我们只是简单地将技术排除在外,只留下了行为。

您需要将这些依赖项传递给演示者并在需要时使用它们。

class Presenter {
    private final CapturingSoundPlayer soundPlayer;
    private final ImageCapturer capturer;

    Presenter(CapturingSoundPlayer soundPlayer, ImageCapturer capturer) {
        this.soundPlayer = soundPlayer;
        this.capturer = capturer;
    }

    void onCaptureButtonClicked() {
        soundPlayer.playSound();
        capturer.captureImage();
    }
}

现在这些接口的实现可以与您的 Activity 完全分开,让您的视图仍然很愚蠢。

这些接口(及其实现)只是逻辑的 units/entities,您的演示者使用这些接口来拆分逻辑。我简单的把"capture"和"playSound"的功能想成简单的动作,就像view.showLoading一样,你的presenter扮演一个orchestrator,它用"something"来操作view,这是视图界面,​​它使用其他东西来操纵声音,这是执行此操作的界面。

如果存储库被认为是数据源,那么我认为这些助手不符合该定义。

如果您有一个实用程序来检索已拍摄的图像,那基本上可以被视为图像的存储库,但简单地拍摄图像只是另一个动作。

您可以 structure/organise 他们觉得合适,但仅仅因为您使用的是 MVP,并非您创建的每个 class 都必须是这些字母之一 (M/V/P) .

有时这些层中的任何一层都需要 classes 逻辑单元来做一些事情,这样你就可以更好地分离关注点。

考虑到您有相当复杂的格式化逻辑,将它分开在一个单独的 class 中而不是演示者是有意义的,但这是否意味着单独的 class 现在是模型?可以,但不一定。