2017-07-06 29 views
0

我正在使用MVP在我的android应用程序中解耦我的视图和模型。我需要知道模型如何将业务逻辑的结果反馈到视图。模型应该如何反馈到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 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; 
    } 

} 

然后设置演讲为听众听众:

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 
    } 

} 

希望这有助于。

对不起,我的英语。

+0

是否有替代方案? @Cochi –

+0

这是您的问题的随便和最简单的实施。但是,您可以使用[EventBus](https://github.com/greenrobot/EventBus)或[RxJava](https://github.com/ReactiveX/RxJava)库作为替代。 EventBus使用非常简单,RxJava功能强大,可能对您的用例来说很大。 – Cochi