android MVP 和 DI
android MVP & DI
我正在创建一个 android 应用程序,我编写了以下 classes 以及界面和代码。因为我尝试使用 MVP 模式,但现在我不确定我的代码是标准的还是不是 ?
我应该为 Di 使用 Dagger2 还是不应该?
模特,主持人class如下:
public class ChangePasswordModel{
public void saveChange(final String oldPass, final String newPass, final ChangePasswordCallback callback) {
/*in real world it change password with API*/
callback.onDo();
} }
我的主持人是:
public class ChangePasswordPresenter{
private ChangePasswordContract.View mView;//this is an interface to interact with Activity
public ChangePasswordPresenter(ChangePasswordContract.View mView) {
this.mView = mView;
}
public void pSaveChange(String oldPass, String newPass) {
ChangePasswordModel model = new ChangePasswordModel();
model.saveChange(oldPass, newPass, new ChangePasswordCallback() {
@Override
public void onDo() {
mView.showMessage("password Changed");
}
});
}
}
- 我是否正确实施了 MVP?
- 我应该使用 Dagger2 进行 DI 吗?为什么?
您在问题中提到的示例代码是 MVP 的正确实现,可以通过一些更改得到改进。
最佳实践是 Dagger、MVP、RxJava、Retrofit 和 Mock 测试可以提高项目的质量和可读性。 MVP 帮助您编写干净且独立的分层代码,RxJava 将帮助您将不同层连接在一起,Dagger2 可以真正帮助您管理依赖关系,还可以使您的 Mocking in test 变得容易。
您可以在我的 Github 上查看这个示例项目 repo,它是使用 Dagger、MVP 开发的,还有一些可用的测试:
我觉得还需要改进。您的模型 class 必须是具体对象 class,但是您的 ChangePasswordModel
包含 saveChange()
方法,但不知道为什么要调用 callback
。这个逻辑必须在Presenter中实现class.
遵循MVP设计模式的基本过程如下:
- 根据您的屏幕创建一个包。假设您有一个注册屏幕。然后创建一个包,
<your.main.package>.signupscreen
.
- 创建三个classSignupActivity、SignupView(这是界面)、SignupPresenter.
SignupView
接口:
interface SignUpView {
String getFirstName();
String getLastName();
String getEmailAddress();
String getPassword();
}
SignupActivity
实现 SignUpView
并持有 SignupPresenter 的引用。
public class SignUpActivity implements SignUpView {
@Inject
public Service mService;
SignUpPresenter mSignUpPresenter;
@Override
protected void onStart() {
super.onStart();
mSignUpPresenter = new SignUpPresenter(mService, this);
}
@Override
protected void onStop() {
super.onStop();
if (mSignUpPresenter != null) {
mSignUpPresenter.onStop();
}
}
@Override
public String getFirstName() {
return etFirstName.getText().toString().trim();
}
@Override
public String getLastName() {
return etLastName.getText().toString().trim();
}
@Override
public String getEmailAddress() {
return etEmail.getText().toString().trim();
}
@Override
public String getPassword() {
return etPassword.getText().toString().trim();
}
}
最后 SignupPresenter
class:
class SignUpPresenter implements SignUpCallback {
private final Service service;
private final SignUpView view;
private CompositeSubscription subscriptions;
SignUpPresenter(Service service, SignUpView view) {
this.service = service;
this.view = view;
this.subscriptions = new CompositeSubscription();
}
void onStop() {
subscriptions.unsubscribe();
}
}
这是基于 MVP 的 Activity 的非常基本的实现。我确实建议看看这个关于 MVP、Retrofit 和 Dagger 2 的很棒的文档,A Simple Android Apps with MVP, Dagger, RxJava, and Retrofit
我正在创建一个 android 应用程序,我编写了以下 classes 以及界面和代码。因为我尝试使用 MVP 模式,但现在我不确定我的代码是标准的还是不是 ? 我应该为 Di 使用 Dagger2 还是不应该? 模特,主持人class如下:
public class ChangePasswordModel{
public void saveChange(final String oldPass, final String newPass, final ChangePasswordCallback callback) {
/*in real world it change password with API*/
callback.onDo();
} }
我的主持人是:
public class ChangePasswordPresenter{
private ChangePasswordContract.View mView;//this is an interface to interact with Activity
public ChangePasswordPresenter(ChangePasswordContract.View mView) {
this.mView = mView;
}
public void pSaveChange(String oldPass, String newPass) {
ChangePasswordModel model = new ChangePasswordModel();
model.saveChange(oldPass, newPass, new ChangePasswordCallback() {
@Override
public void onDo() {
mView.showMessage("password Changed");
}
});
}
}
- 我是否正确实施了 MVP?
- 我应该使用 Dagger2 进行 DI 吗?为什么?
您在问题中提到的示例代码是 MVP 的正确实现,可以通过一些更改得到改进。
最佳实践是 Dagger、MVP、RxJava、Retrofit 和 Mock 测试可以提高项目的质量和可读性。 MVP 帮助您编写干净且独立的分层代码,RxJava 将帮助您将不同层连接在一起,Dagger2 可以真正帮助您管理依赖关系,还可以使您的 Mocking in test 变得容易。
您可以在我的 Github 上查看这个示例项目 repo,它是使用 Dagger、MVP 开发的,还有一些可用的测试:
我觉得还需要改进。您的模型 class 必须是具体对象 class,但是您的 ChangePasswordModel
包含 saveChange()
方法,但不知道为什么要调用 callback
。这个逻辑必须在Presenter中实现class.
遵循MVP设计模式的基本过程如下:
- 根据您的屏幕创建一个包。假设您有一个注册屏幕。然后创建一个包,
<your.main.package>.signupscreen
. - 创建三个classSignupActivity、SignupView(这是界面)、SignupPresenter.
SignupView
接口:
interface SignUpView {
String getFirstName();
String getLastName();
String getEmailAddress();
String getPassword();
}
SignupActivity
实现 SignUpView
并持有 SignupPresenter 的引用。
public class SignUpActivity implements SignUpView {
@Inject
public Service mService;
SignUpPresenter mSignUpPresenter;
@Override
protected void onStart() {
super.onStart();
mSignUpPresenter = new SignUpPresenter(mService, this);
}
@Override
protected void onStop() {
super.onStop();
if (mSignUpPresenter != null) {
mSignUpPresenter.onStop();
}
}
@Override
public String getFirstName() {
return etFirstName.getText().toString().trim();
}
@Override
public String getLastName() {
return etLastName.getText().toString().trim();
}
@Override
public String getEmailAddress() {
return etEmail.getText().toString().trim();
}
@Override
public String getPassword() {
return etPassword.getText().toString().trim();
}
}
最后 SignupPresenter
class:
class SignUpPresenter implements SignUpCallback {
private final Service service;
private final SignUpView view;
private CompositeSubscription subscriptions;
SignUpPresenter(Service service, SignUpView view) {
this.service = service;
this.view = view;
this.subscriptions = new CompositeSubscription();
}
void onStop() {
subscriptions.unsubscribe();
}
}
这是基于 MVP 的 Activity 的非常基本的实现。我确实建议看看这个关于 MVP、Retrofit 和 Dagger 2 的很棒的文档,A Simple Android Apps with MVP, Dagger, RxJava, and Retrofit