私はMVPについて読んだことがあります。私はそれについて多くの異なる実装を見たので、これは私の質問に関連する3つの基本ルールです。MVPアーキテクチャーアンドロイドクラスについてのジレンマ
1。このビューは、showImage
のようなUiについてのみ発表者からの注文を受け取り、takePictureButtonPressed
のようなUiのやりとりについて発表者に通知します。
2。プレゼンターはデータとアプリケーションのロジックを保持しますが、ビューには触れません。そうするためにビューを注文します。
3。プレゼンターは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ヘルパー としてビューを対処することである。
@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);
プレゼンターの中で私はビットマップを視野に入れて渡しますが、そのようにして私のプレゼンターは私が彼に欲しくないアンドロイドライブラリを使って行動します。
さらに簡単な例は、ユーザーがカメラを持っている場合のみtakeImageのボタンを表示する場合です。プレゼンターはデバイスにカメラが付いていてもプレゼンターが私のアプローチでアンドロイドを使用していないことを知る必要がありますこの:
getView().showCameraComponents(getView().isCameraAvailable());
ので、私の見解は、あなたはそうすることをお勧めだと思いプレゼンター
のためのAndroidのスタッフヘルパーとしてビューや行為を処理していますか?
最高のアプローチとは何ですか?
true MVPはあなたが気づいたようにアンドロイドに実装することは不可能です。一般的に、あなたはより悪い悪を選ぶ。どんな場合でも、あなたのために働くものを選択してください –