我已经阅读过MVP,我看到了很多不同的实现,所以这是我遵循的与我的问题相关的3条基本规则。
1。视图将仅接收来自演示者的订单,仅限于showImage
这样的Ui,并将通知演示者关于Ui互动,例如takePictureButtonPressed
。
2。 Presenter将保存应用程序的数据和逻辑但不会触及视图,他将命令视图这样做。
3。 Presenter不会导入任何Android类。我认为我们已经根据UnitTest的原因决定了它,并且很容易知道你正在实现它,所以在我们拥有的每个项目中,我们都会或多或少地使用相同的实现。
我的问题/问题是在我们需要做一个比showImage
示例:
让我们说我们想要拍照并在图像视图中显示它并在我的应用程序中保存未来逻辑的路径。
按钮点击 - >该视图将通知演示者 - >演示者将告诉视图开始摄像头 - >
@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创建Bitmap,所以我在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东西助手
你会说这样做是好的做法吗?
最好的方法是什么?为什么?
答案 0 :(得分:1)
一般情况下,我建议您将View和Presente的功能视为如下。
查看:
主讲人:
此外,避免使用Android组件和与上下文相关的组件的好方法是多态性。
为不同的用例创建一个接口,并实现它们包装android组件等。 如果演示者,模型或任何其他组件需要与应用程序上下文相关的内容,则可以使用接口并为其实现提供依赖注入。
小例子(用匕首):
public interface CameraAvaialableDetector {
boolean isCameraAvailable();
}
Presenter或者interctor有字段:
@Inject CameraAvaialableDetector mCameraAvailableDetector
使用依赖注入,您可以为其提供任何CameraAvaialableDetector实现,例如您的片段或模拟测试。