【发布时间】:2018-04-07 08:24:12
【问题描述】:
所以,我目前正在尝试在我不熟悉的 android 中实现 MVP 方法。现在,它声明presenter 和interactor 类都不应该了解android 类或组件。
将业务逻辑与框架分离是有意义的。 到目前为止还不错。
但是,我有一个演示者,它实现了一个回调以登录交互器,它传递了一个字符串资源 ID。演示者将字符串 res id 传递给以某种形式(无论是 toast 还是对话框)显示错误消息的视图。
交互者:
public interface SignInteractor {
void login(String email, String password, OnLoginListener loginListener);
interface OnLoginListener {
void onLoginSuccess();
void onLoginFail(int error);
}
}
演讲者:
public interface SignInPresenterImpl {
private SignInteractorImpl mInteractor; // interactor implementation
private SignInView mSignInView; // view reference
// additional code
void login(String email, String password){
mInteractor.login(email,password, new SignInteractor.OnLoginListener(){
@Override
public void onLoginSuccess() {
if (mSignInView != null) {
mSignInView.signInSuccess();
}
}
@Override
public void onLoginFail(final int error) {
if (mSignInView != null) {
mSignInView.showError(R.string.error);
}
}
})
}
}
活动视图:
SignInViewActivity implements SignInView{
// additional code
void showError(int resId){
Toast.makeText(this, getString(resId), Toast.LENGTH_SHORT).show();
}
}
但是,由于 R 文件是 android 框架的一部分,这会使演示者和交互器无法在纯 Java 应用程序中使用。
我在各种论坛上浏览了许多文章和讨论,这些文章和讨论提供了实现这一目标的各种方法。
解决方案:
-
view 应该使用类似 showLoginError() 的方法并自己决定如何处理视图逻辑。这样,presenter 就不知道 android 相关的东西了。
- 但是,无法从交互器进行字符串操作。
-
在视图中创建处理所有情况的特定方法,例如 showinvalidEmail()、showinvalidPassword() 等。
- 方法太多,复杂情况下很难。
使用枚举作为错误类型并传递给视图 view.showError(ErrorTypes.INVALID_EMAIL) - 仍然对#enumsmatter 感到困惑 :)
https://www.reddit.com/r/androiddev/comments/4v4urs/mvp_question_how_do_you_populate_your_textviews/
- 使用提供所需字符串的资源抽象或包装类。
- 当要使用大量字符串时很难。
https://medium.com/@daptronic/android-mvp-the-curious-case-of-resources-ddca39c1fccd
- 使用为strings.xml中的每个字符串提供api实现的库
- 仍处于测试阶段
https://github.com/Comcast/resourceprovider
请建议在不违反 mvp 或干净架构原则的情况下实现此目标的最佳方法。
【问题讨论】:
标签: java android android-resources android-mvp