关于android类的MVP架构Dilema

关于android类的MVP架构Dilema,android,architecture,mvp,Android,Architecture,Mvp,我读过关于MVP的书,看到了许多不同的MVP实现,所以这是我遵循的与我的问题相关的3条基本规则 一,。视图将只接收来自演示者的有关showImage之类的Ui的命令,并将通知演示者有关takePictureButtonPressed之类的Ui交互 二,。演示者将保存应用程序的数据和逻辑,但不会接触视图,他将命令视图这样做 三,。演示者不会导入任何Android类。我认为我们之所以决定这样做,是出于单元测试的原因,也是因为我们可以通过一种简单的方式知道您正在正确地实现它,所以在我们拥有的每个项目中

我读过关于MVP的书,看到了许多不同的MVP实现,所以这是我遵循的与我的问题相关的3条基本规则

一,。视图将只接收来自演示者的有关showImage之类的Ui的命令,并将通知演示者有关takePictureButtonPressed之类的Ui交互

二,。演示者将保存应用程序的数据和逻辑,但不会接触视图,他将命令视图这样做

三,。演示者不会导入任何Android类。我认为我们之所以决定这样做,是出于单元测试的原因,也是因为我们可以通过一种简单的方式知道您正在正确地实现它,所以在我们拥有的每个项目中,或多或少都会有相同的实现

我的问题是,当我们需要做一个比showImage更复杂的android产品时

例如:

假设我们想要拍摄照片并在图像视图中显示它,并保存路径,以便将来在我的应用程序中使用逻辑

单击按钮->视图将通知演示者->演示者将告诉视图启动摄像头->

@Override
public void dispatchTakePictureIntent() {
        // Blah Blah Blah
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        mImagePath = photoFile.getAbsolutePath();
    }
} 
当结果来临时:

        mPresenter.profileImageReceived(mImagePath);
然后我想显示图像,为了显示它,我们需要从imagePath创建位图,所以我在ImageUtils中编写了一个方法,它可以为我实现这一点……到目前为止,效果很好

有什么问题

我的方法使用android类,所以它不能在我的演示者和 该视图不应该做任何事情,而是显示内容

与应用程序逻辑无关的android方法应该在哪里

我当前的解决方案是将视图作为视图处理程序和android助手来处理 因此,在我看来,我将把路径转换成如下位图:

    @Override
    public void setProfileImage(String imagePath) {
        Bitmap bitmap = ImageUtils.getBitmapFromPath(imagePath);
        mPhotoImage.setImageBitmap(bitmap);
        bitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
     }
    getView().showCameraComponents(getView().isCameraAvailable());   
另一种方法是:

        Bitmap bitmap = ImageUtils.getBitmapFromPath(imagePath);
在演示者内部,我会将位图发送到视图中,但这样我的演示者将使用android库执行我不希望他执行的操作

另一个更简单的例子是,我只想在用户有摄像头的情况下显示takeImage的按钮,因此演示者需要知道设备是否有摄像头,但演示者在我的方法中没有使用android,因此如下所示:

    @Override
    public void setProfileImage(String imagePath) {
        Bitmap bitmap = ImageUtils.getBitmapFromPath(imagePath);
        mPhotoImage.setImageBitmap(bitmap);
        bitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
     }
    getView().showCameraComponents(getView().isCameraAvailable());   
因此,我的视图处理视图并充当演示者的Android stuff助手

你认为这样做是好的做法吗


最好的方法是什么?为什么?

一般来说,我建议您按以下方式处理视图和演示者的功能

视图:

获取用户输入和操作,并将其传递给演示者formdata,单击按钮,还可以输入拍照 主持人点菜吗 演示者:

决定如何处理视图输入 给出查看显示内容的命令 此外,避免使用android组件和非常上下文相关的组件的好方法是多态性

为不同的用例制作一个接口,并实现它们包装android组件等。 如果演示者、模型或任何其他组件需要与应用程序上下文相关的内容,则您可以使用接口并通过依赖项注入提供其实现

匕首小例子:

public interface CameraAvaialableDetector {
    boolean isCameraAvailable();
}
演示者或交互者具有以下字段:

@Inject CameraAvaialableDetector mCameraAvailableDetector

通过依赖注入,您可以为其提供任何CameraAvailableDetector实现,例如用于测试的片段或模拟。正如您所注意到的,在android中几乎不可能实现真正的MVP。通常你选择较小的邪恶。在任何情况下,选择对你有用的好主意,没有Dagger我怎么做?这意味着当应用程序从上下文开始时,我需要创建这个类,对吗?所以它就像AndroidHelper或Provider