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)一起使用?有什么指导方针吗?
这是解决此类问题的一种方法。
你的问题是有些代码对于进入演示者来说是有意义的,但是它太 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 完全分开,让您的视图仍然很愚蠢。
这些接口(及其实现)只是逻辑的 units/entities,您的演示者使用这些接口来拆分逻辑。我简单的把"capture"和"playSound"的功能想成简单的动作,就像view.showLoading
一样,你的presenter扮演一个orchestrator,它用"something"来操作view,这是视图界面,它使用其他东西来操纵声音,这是执行此操作的界面。
如果存储库被认为是数据源,那么我认为这些助手不符合该定义。
如果您有一个实用程序来检索已拍摄的图像,那基本上可以被视为图像的存储库,但简单地拍摄图像只是另一个动作。
您可以 structure/organise 他们觉得合适,但仅仅因为您使用的是 MVP,并非您创建的每个 class 都必须是这些字母之一 (M/V/P) .
有时这些层中的任何一层都需要 classes 逻辑单元来做一些事情,这样你就可以更好地分离关注点。
考虑到您有相当复杂的格式化逻辑,将它分开在一个单独的 class 中而不是演示者是有意义的,但这是否意味着单独的 class 现在是模型?可以,但不一定。
我正在尝试使用 google sample code for mvp 实现 MVP 架构。我有一个 activity 作为具有演示者和模型的视图。单击按钮,用户可以捕获图像并将其保存在外部存储器中。在捕获点击时,我还需要播放声音。
我不确定应该将哪个代码放在哪个 class 中,因为我无法将相机捕获和播放声音代码放在 Activity 中(我将其视为视图)以保持视图是哑的尽可能,我不能把代码放在 Presenter 中,因为它使用 Android 框架 classes(上下文等)。
所以,唯一的选择是将它放在模型中,但在示例代码中,模型只有存储库(我认为这仅与数据源相关local/remote)。
如何将此代码放入模型中以及如何 link 将其与其他组件(如 View 和 Presenter)一起使用?有什么指导方针吗?
这是解决此类问题的一种方法。
你的问题是有些代码对于进入演示者来说是有意义的,但是它太 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 完全分开,让您的视图仍然很愚蠢。
这些接口(及其实现)只是逻辑的 units/entities,您的演示者使用这些接口来拆分逻辑。我简单的把"capture"和"playSound"的功能想成简单的动作,就像view.showLoading
一样,你的presenter扮演一个orchestrator,它用"something"来操作view,这是视图界面,它使用其他东西来操纵声音,这是执行此操作的界面。
如果存储库被认为是数据源,那么我认为这些助手不符合该定义。
如果您有一个实用程序来检索已拍摄的图像,那基本上可以被视为图像的存储库,但简单地拍摄图像只是另一个动作。
您可以 structure/organise 他们觉得合适,但仅仅因为您使用的是 MVP,并非您创建的每个 class 都必须是这些字母之一 (M/V/P) .
有时这些层中的任何一层都需要 classes 逻辑单元来做一些事情,这样你就可以更好地分离关注点。
考虑到您有相当复杂的格式化逻辑,将它分开在一个单独的 class 中而不是演示者是有意义的,但这是否意味着单独的 class 现在是模型?可以,但不一定。