繁体   English   中英

关于android类的MVP架构Dilema

[英]MVP Architecture Dilema about android classes

我已经了解了MVP,并且看到了MVP的许多不同实现,所以这是我遵循的与问题相关的3条基本规则。

1。 View将仅从主持人那里收到有关Ui的命令,例如showImage ,并将通知主持人有关Ui交互(例如takePictureButtonPressed

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

3。 演示者将不会导入任何Android类。 我认为我们已经出于UnitTest的原因决定了它,并以一种简单的方式知道您正确地实现了它,因此在每个项目中,我们或多或少都会有一个相同的实现。

我的问题/问题是在一个场景中,当我们需要做一个比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);
     }

另一种方法是:

        Bitmap bitmap = ImageUtils.getBitmapFromPath(imagePath);

在演示者内部,我将把位图准备好传递给视图,但是这样,我的演示者将对android库进行操作,我不想他这么做。

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

    getView().showCameraComponents(getView().isCameraAvailable());   

所以我的视图正在处理视图并充当演示者的Android助手

您会说这样做是一种好习惯吗?

最佳方法是什么,为什么?

通常,我建议您按以下方式处理View and Presente的功能。

视图:

  • 接受用户的输入和操作,并将其传递给演示者(formdata,单击按钮,还拍摄照片)
  • 主持人订单

主持人:

  • 决定如何处理视图输入
  • 下订单查看要显示的内容

此外,避免使用android组件和与上下文相关的组件的好方法是多态。

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

小例子(带匕首):

public interface CameraAvaialableDetector {
    boolean isCameraAvailable();
}

演示者或交互者具有以下领域:

@Inject CameraAvaialableDetector mCameraAvailableDetector

使用依赖注入,您可以为它提供任何CameraAvaialableDetector实现,例如您的片段或模拟测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM