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");
        }
 });
}

}

  1. 我是否正确实施了 MVP
  2. 我应该使用 Dagger2 进行 DI 吗?为什么?

您在问题中提到的示例代码是 MVP 的正确实现,可以通过一些更改得到改进。

最佳实践是 DaggerMVPRxJavaRetrofitMock 测试可以提高项目的质量和可读性。 MVP 帮助您编写干净且独立的分层代码,RxJava 将帮助您将不同层连接在一起,Dagger2 可以真正帮助您管理依赖关系,还可以使您的 Mocking in test 变得容易。

您可以在我的 Github 上查看这个示例项目 repo,它是使用 Dagger、MVP 开发的,还有一些可用的测试:

http://github.com/mmirhoseini/fyber_mobile_offers

我觉得还需要改进。您的模型 class 必须是具体对象 class,但是您的 ChangePasswordModel 包含 saveChange() 方法,但不知道为什么要调用 callback。这个逻辑必须在Presenter中实现class.

遵循MVP设计模式的基本过程如下:

  1. 根据您的屏幕创建一个包。假设您有一个注册屏幕。然后创建一个包,<your.main.package>.signupscreen.
  2. 创建三个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