android - android MVP中模型应该如何反馈到 View ?

标签 android android-mvp

我正在使用 MVP 来解耦 Android 应用程序中的 View 和模型。我需要知道模型应该如何将业务逻辑的结果反馈给 View 。

例如,如果按下按钮登录,则 Activity 将如下所示,使用 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
        }
    });

注释中说//处理不成功的事情,模型如何将业务逻辑的结果反馈给 View ,以便 View 可以处理这些结果?

谢谢。

最佳答案

您可以使用接口(interface)作为回调,例如:

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
    }

}

希望这有帮助。

抱歉我的英语不好。

关于android - android MVP中模型应该如何反馈到 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44949457/

相关文章:

java - 使用 ActivityUnitTestCase 时出现 RuntimeException,但在 ActivityInstrumentationTestCase2 时不会

Android - 如何在 SQLite 数据库中存储 html 字符串

android - 使用 kotlin 自定义扩展的带有扩展过滤器的打开文件对话框

android - MVP 与 MVVM : how to manage alert dialogs in MVVM and improve testability

android - MVP 架构模式中的实时数据

android - Android的MVP结构如何在Fragment中初始化Presenter

android - 防止 Dagger 2 组件在屏幕上旋转

java - RecyclerView中的Android居中项目

Android - 当设备屏幕为空白时不接收 Wi-Fi 连接更改 Intent

android - 单元测试应该涵盖常量变化吗?