[英]Should the Presenter know about the Activity in Android MVP architecture?
[英]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的功能。
视图:
主持人:
此外,避免使用android组件和与上下文相关的组件的好方法是多态。
为不同的用例创建一个接口,并实现它们来包装android组件等。如果演示者,模型或任何其他组件需要与应用程序上下文相关的内容,则可以使用接口并为其提供依赖项注入。
小例子(带匕首):
public interface CameraAvaialableDetector {
boolean isCameraAvailable();
}
演示者或交互者具有以下领域:
@Inject CameraAvaialableDetector mCameraAvailableDetector
使用依赖注入,您可以为它提供任何CameraAvaialableDetector实现,例如您的片段或模拟测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.