【发布时间】: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