【问题标题】:MVP Architecture Dilema about android classes关于 android 类的 MVP 架构困境
【发布时间】:2018-04-21 05:45:53
【问题描述】:

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

1 . View 将仅接收来自演示者的关于 Ui 的命令,例如 showImage,并将通知演示者有关 Ui 交互的信息,例如 takePictureButtonPressed

2 。 Presenter 将保存应用程序的数据和逻辑,但不会触及视图,他将命令视图这样做。

3 . Presenter 不会导入任何 Android 类。我认为我们已经决定出于 UnitTest 的原因和一个简单的方法来知道您正在正确实施它,因此在我们拥有的每个项目中,我们或多或少都会有相同的实施。

我的问题/问题是在我们需要做一个比showImage更复杂的android东西的场景中

例子:

假设我们要拍照并在图像视图中显示它,并为我的应用程序中的未来逻辑保存路径。

按钮点击->view会通知presenter->presenter会告诉view启动摄像头->

@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 内容助手

你会说这样做是个好习惯吗?

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

【问题讨论】:

  • 如您所见,真正的 MVP 几乎不可能在 android 中实现。一般来说,你选择较小的邪恶。无论如何,选择适合您的方式

标签: android architecture mvp


【解决方案1】:

一般来说,我建议您将 View 和 Presente 的功能如下处理。

查看:

  • 接受用户输入和操作并将其传递给演示者(表单数据、按钮单击、拍照也是输入)
  • 主持人有订单吗

演讲者:

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

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

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

小例子(带匕首):

public interface CameraAvaialableDetector {
    boolean isCameraAvailable();
}

演示者或交互者具有字段:

@Inject CameraAvaialableDetector mCameraAvailableDetector

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

【讨论】:

  • 好主意,没有 Dagger 我该怎么做?
  • 这意味着当应用程序从上下文开始时我需要创建这个类,对吗?所以它会像 AndroidHelper 或 Provider
猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多