关于android类的MVP架构Dilema
我读过关于MVP的书,看到了许多不同的MVP实现,所以这是我遵循的与我的问题相关的3条基本规则 一,。视图将只接收来自演示者的有关showImage之类的Ui的命令,并将通知演示者有关takePictureButtonPressed之类的Ui交互 二,。演示者将保存应用程序的数据和逻辑,但不会接触视图,他将命令视图这样做 三,。演示者不会导入任何Android类。我认为我们之所以决定这样做,是出于单元测试的原因,也是因为我们可以通过一种简单的方式知道您正在正确地实现它,所以在我们拥有的每个项目中,或多或少都会有相同的实现 我的问题是,当我们需要做一个比showImage更复杂的android产品时 例如: 假设我们想要拍摄照片并在图像视图中显示它,并保存路径,以便将来在我的应用程序中使用逻辑 单击按钮->视图将通知演示者->演示者将告诉视图启动摄像头->关于android类的MVP架构Dilema,android,architecture,mvp,Android,Architecture,Mvp,我读过关于MVP的书,看到了许多不同的MVP实现,所以这是我遵循的与我的问题相关的3条基本规则 一,。视图将只接收来自演示者的有关showImage之类的Ui的命令,并将通知演示者有关takePictureButtonPressed之类的Ui交互 二,。演示者将保存应用程序的数据和逻辑,但不会接触视图,他将命令视图这样做 三,。演示者不会导入任何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