2017-11-08 12 views
0

私は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のスタッフヘルパーとしてビューや行為を処理していますか?

最高のアプローチとは何ですか?

+1

true MVPはあなたが気づいたようにアンドロイドに実装することは不可能です。一般的に、あなたはより悪い悪を選ぶ。どんな場合でも、あなたのために働くものを選択してください –

答えて

1

一般的に、ViewとPresenteの機能を以下のように扱うことをお勧めします。

ビュー:

  • は、ユーザー入力とアクションを取り、それがプレゼンターに渡す(FORMDATA、ボタンクリック、写真を撮ることにも入力されている)
  • は、プレゼンターの注文

プレゼンターを行います

  • ビューの入力を決定する
  • は何を表示するかを指示する

さらに、Androidコンポーネントと非常にコンテキスト関連のコンポーネントを使用することを避けるための良い方法は多態性です。

さまざまなユースケース用のインターフェイスを作成し、アンドロイドコンポーネントなどをラップして実装します。 プレゼンター、モデル、またはその他のコンポーネントがアプリコンテキストに関連するものを必要とする場合は、インターフェイスで作業し、その実装に依存性注入を提供できます。

(短剣付き)スモール例:プレゼンターまたは相互作用物質は、フィールドがある

public interface CameraAvaialableDetector { 
    boolean isCameraAvailable(); 
} 

:依存性の注入で

@Inject CameraAvaialableDetector mCameraAvailableDetector 

をあなたのフラグメントまたはモックは、テストのために、たとえば任意のCameraAvaialableDetectorの実装とそれを提供することができます。

+0

良いアイデア、私はそれをダガーなしでどうしますか? –

+0

これは、アプリケーションがコンテキストを正しく開始するときにこのクラスを作成する必要があるということですか? AndroidHelperやProviderのようになります –