2017-07-06 68 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