【问题标题】:Android MVP (Repository pattern) get Camera/Gallery Image?Android MVP(存储库模式)获取相机/画廊图像?
【发布时间】:2017-12-11 10:18:52
【问题描述】:

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

我不确定应该将哪些代码放在哪个类中,因为我无法在 Activity(我将其视为视图)中放置摄像头捕获和播放声音代码以使视图尽可能地哑,并且我无法将该代码放在 Presenter 中因为它使用 Android 框架类(上下文等)。

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

如何将此代码放入模型中,以及如何将其与 View 和 Presenter 等其他组件链接?有什么指导方针吗?

【问题讨论】:

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


    【解决方案1】:

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

    你的问题是一些代码进入演示者是有意义的,但是它太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 完全分离,让您的视图仍然愚蠢。

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

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

    如果您有一个实用程序来检索已捕获的图像,则基本上可以将其视为图像的存储库,但简单地拍摄图像只是另一种操作。

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

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

    考虑到您有相当复杂的格式化逻辑,将其分隔在除演示者之外的单独类中是有意义的,但这是否意味着单独的类现在是模型?可以,但不一定。

    【讨论】:

    • 感谢您的回复。但是我仍然对它的模型/存储库部分感到困惑,也许我太新手了。您能否详细说明我应该在哪里实现这些接口,例如捕获和媒体播放器的实际代码。该代码应该在模型中吗?如果是,那么模型不仅适用于数据源 (http/db) 等存储库。我应该创建一个 CameraRepository 并在那里实现这些接口吗?
    • 我已经更新了答案,因为它对于评论来说有点太大了:D
    • 这样我就可以创建一个辅助类来捕获和播放声音。这意味着 Presenter 不必只与模型交互来做一些事情,它还可以与其他 Helper 类交互。我觉得我受mvp限制太多了。我明白你的意思了。问候
    • 你当然可以!你会发现对你的助手进行单独的单元测试会更容易,也会制作漂亮的小型演示者/视图类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    相关资源
    最近更新 更多