2017-07-06 11 views
0

MVPを使用して、私のビューとモデルをAndroidアプリケーションでデカップリングしています。ビジネスロジックの結果をモデルにフィードバックする方法を知る必要があります。例えば、ボタンがログインするために押された場合アンドロイドMVPのビューへのモデルフィードバックはどのようにする必要がありますか?

は、活動がbutterknifeに@OnClickアノテーションを使って、このようになります:

@OnClick(R.id.login_button) 
public void login() { 
    String email = mEmailEditText.getText().toString(); 
    String password = mPasswordEditText.getText().toString(); 
    LoginCredentials loginCredentials = new LoginCredentials(email, password); 
    mPresenter.loginWithEmail(loginCredentials); 
} 

プレゼンターが、その後検証し、リポジトリに要求するだろう:

public void loginWithEmail(LoginCredentials loginCredentials) { 
    boolean isEmailValid = AuthValidator.validateEmail(loginCredentials.getUsername()); 
    boolean isPasswordValid = AuthValidator.validatePassword(loginCredentials.getPassword()); 

    if(isEmailValid && isPasswordValid) repository.loginEmailUser(loginCredentials); 

    if (!isEmailValid) view.handleInvalidEmail(); 

    if (!isPasswordValid) view.handleInvalidPassword(); 
} 

リポジトリは、ビジネスロジックを実行します:

@Override 
public void loginEmailUser(LoginCredentials loginCredentials) { 
    Call<Token> call = userServiceApi.loginInToken(loginCredentials); 
    call.enqueue(new Callback<Token>() { 
     @Override 
     public void onResponse(@NonNull Call<Token> call, @NonNull Response<Token> response) { 
      if (response.isSuccessful()) { 
       // handle successful login 
      } else { 
       // Handle unsuccessful login 
      } 
     } 

     @Override 
     public void onFailure(@NonNull Call<Token> call, @NonNull Throwable t) { 
      // Handle failed request 
     } 
    }); 

コメントでは// handle unsuccessful somethingと表示されますが、ビューがこれらの結果を処理できるように、モデルへのフィードバックはビジネスロジックの結果をどのように表示しますか?

ありがとうございます。

+0

いつものように...コールバック – Selvin

+0

プレゼンターにあなたがプレゼンターに添付したプレゼンターを通して完了 –

+0

これが何であるか分かっていれば、私は質問しませんでした。あなたは詳細を教えていただけますか? –

答えて

1

あなたは、例えば、コールバックなどのインタフェースを使用することができます。

public class MyPresenter implements RepositoryCallback { 


    public void loginWithEmail(LoginCredentials loginCredentials) { 
     repository.setRepositoryCallback(this) // here or in the presenter constructor 
     boolean isEmailValid = AuthValidator.validateEmail(loginCredentials.getUsername()); 
     boolean isPasswordValid = AuthValidator.validatePassword(loginCredentials.getPassword()); 

     if(isEmailValid && isPasswordValid) repository.loginEmailUser(loginCredentials); 

     if (!isEmailValid) view.handleInvalidEmail(); 

     if (!isPasswordValid) view.handleInvalidPassword(); 
    } 

    @Override 
    public void onLoginEmailUserSuccess(//paramaters if you need){ 
     // your code 
    } 

    @Override 
    public void onLoginEmailUserError(//paramaters if you need){ 
     // your code 
    } 

    @Override 
    public void onRequestFailed(//paramaters if you need){ 
     // your code 
    } 

} 

ホープ:リポジトリに

public interface RepositoryCallback { 

    void onLoginEmailUserSuccess(/*paramaters if you need*/); 
    void onLoginEmailUserError(/*paramaters if you need*/); 
    void onRequestFailed(/*paramaters if you need*/) 

} 

はリスナーとしてプレゼンターを設定そして

public class MyRepository { 

    private RepositoryCallback mListener; 

    @Override 
    public void loginEmailUser(LoginCredentials loginCredentials) { 
     Call<Token> call = userServiceApi.loginInToken(loginCredentials); 
     call.enqueue(new Callback<Token>() { 
      @Override 
      public void onResponse(@NonNull Call<Token> call, @NonNull Response<Token> response) { 
       if (response.isSuccessful()) { 
        // handle successful login 
        if (mListener != null) { 
         mListener.onLoginEmailUserSuccess() 
        } 
       } else { 
        // Handle unsuccessful login 
        if (mListener != null) { 
         mListener.onLoginEmailUserError() 
        } 
       } 
      } 

      @Override 
      public void onFailure(@NonNull Call<Token> call, @NonNull Throwable t) { 
       // Handle failed request 
       if (mListener != null) { 
        mListener.onRequestFailed() 
       } 
      } 
     }); 

    public void setRepositoryCallback(RepositoryCallback listener) { 
     mListener = listener; 
    } 

} 

リスナーを定義しましたこれは役に立ちます。

私の英語のために残念です。

+0

代替手段はありますか? @Cochi –

+0

これはあなたの問題のカジュアルで最も単純な実装です。ただし、代わりに[EventBus](https://github.com/greenrobot/EventBus)または[RxJava](https://github.com/ReactiveX/RxJava)ライブラリを使用することができます。 EventBusは非常に使いやすいですが、RxJavaは強力で、ユースケースには多分大きいでしょう。 – Cochi

関連する問題