OnClickはPresenter
メソッドを呼び出す必要があります。プレゼンターでビジネスを行う必要があります.Uiを更新する必要がある場合は、View
にメソッドを定義し、それをプレゼンターから呼び出す必要があります。
あなたはView
元のための方法が必要になります。
public void showCounterCount(final int totalClicks){
counterTextView.setText("Total clicks so far: "+totalClicks);
}
また、あなたが方法とあなたのPresenter
内の変数が必要です。
int totalClicks = 0;
public void onCounterButtonClicked(){
totalClicks++;
mView.showCounterCount(totalClicks);
}
そして、このようなあなたのコードをリファクタリング:
counterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
mPresenter.onCounterButtonClicked();
}
});
を
もっと複雑でクリーンなアーキテクチャでは、ユースケースを行うことができますインタラクターのビジネス。 (あなたの例では、カウンタ値をインクリメントすることはアプリケーションのユースケースです)
インタラクタを定義してカウンタ値を増やすことができます。
CounterInteractor:
public CounterInteractor{
public int incrementCounter(int currentCounter){
return currentCounter+1;
}
}
、以下のようなあなたのプレゼンターをリファクタリング:
int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();
public void onCounterButtonClicked(){
totalClicks = mCounterInteractor.incrementCounter(totalClicks);
mView.showCounterCount(totalClicks);
}
この方法であなたがプレゼンターから完全にビジネスロジックを分離し、内のコードを複製することなく、あなたのユースケースの概念を使用して再プレゼンター。これはよりクリーンなアプローチです。
MVPアプローチごとにこのgit repoをチェックすることもできます。 https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/
幸運。
編集:私はMVP
を実装しようとしている https://github.com/savepopulation/wikilight
:
は、ここに私の軽量ウィキペディアクライアントプロジェクトのソースです。 (MVP + Dagger2 + RxJava)
これはMVPのアプローチであれば、私はそれを元のスニペットよりも改善しているとは思えません。 1つの抽象化/リダイレクトを追加しましたが、利点はどこにありますか? – Jim
私たちは、アプリケーションを3つのレイヤーに分割し、ビジネスロジックをUIから分離します。アクティビティとフラグメントはビューであり、uiの更新のみを担当し、プレゼンタから呼び出されるインタフェースメソッドを含んでいます。あなたの例は非常にシンプルなので、利点を見るのは難しいですが、大きなアプリではそれをよりはっきりと見ることができます。また、UIテストにも役立ちます。このリンクをチェックすることができます。 http://antonioleiva.com/mvp-android/ – savepopulation
大きな利点はテストです。上記の例では、Androidフレームワークに依存せずにPresenterで 'onCounterButtonClicked()'メソッドの単体テストを書くことができます。このようなテストは、JVM上で実行できます。私はプレゼンターのメソッド名に 'button'や' click'などの言葉を避けて、Viewレイヤーのコンセプトにリンクすることはあまりありません – Jahnold