Android MVP(存储库模式)获取相机/图库图像?

时间:2017-12-11 10:18:52

标签: android dependency-injection repository-pattern android-mvp

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

我不确定哪个代码应该放在哪个类中,因为我无法将相机捕获并在Activity中播放声音代码(我将其视为视图)以使视图尽可能保持愚蠢而且我无法将该代码放入Presenter中因为它使用Android框架类(上下文等)。

因此,唯一的选择是将其放在模型中,但在示例代码中,模型只有存储库(我相信它只与本地/远程数据源相关)。

如何将此代码放入模型中以及如何将其与View和Presenter等其他组件相关联?任何指导方针?

1 个答案:

答案 0 :(得分:1)

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

你的问题是有些代码进入演示者是有道理的,但它也是Android y,所以你可以简单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完全分开,使您的视图仍然很愚蠢。

这些接口(及其实现)只是您的演示者用来拆分逻辑的逻辑单元/实体。我只想到"捕获"的功能。和#34; playSound"作为简单的动作,就像view.showLoading一样,你的演示者扮演一个协调者,它会使用"某些东西"操纵视图,这是视图界面,​​它使用其他东西来操纵声音,这是执行此操作的界面。

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

如果您有一个实用程序来检索已捕获的图像,那么基本上可以将其视为图像的回购,但只是拍摄图像,这只是另一个动作。

您可以根据自己的需要构建/组织它们,但仅仅因为您使用的是MVP,并非您创建的每个类都必须是其中一个字母(M / V / P)。

有时,这些图层中的任何一个都需要逻辑单元的类来执行某些操作,以便您更好地分离关注点。

考虑到你有非常复杂的格式化逻辑,在除了演示者之外的单独的类中分离它是有意义的,但这是否意味着单独的类现在是模型?它可以,但它不一定是。