我正在使用 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/