android MVP& DI

时间:2016-10-09 14:24:10

标签: dependency-injection mvp dagger-2

我正在创建一个Android应用程序,我编写以下类和接口和代码。因为我尝试使用MVP模式,但现在我不确定我的代码是否标准? 我应该使用Dagger2 for Di还是不应该? 模特,演示者课程如下:

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吗?为什么呢?
  3. 先谢谢

2 个答案:

答案 0 :(得分:1)

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

最佳做法是混合使用 Dagger MVP RxJava 改造模拟测试可提高项目的质量和可读性。 MVP 可帮助您使用干净且独立的分层代码, RxJava 将有助于将不同的层连接在一起, Dagger2 可以真正帮助您管理依赖关系并且还可以让你的模拟测试变得简单。

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

  

http://github.com/mmirhoseini/fyber_mobile_offers

答案 1 :(得分:1)

我认为需要改进。您的Model类必须是具体的对象类,但是ChangePasswordModel包含saveChange()方法,不知道它为什么调用callback。此逻辑必须在Presenter类中实现。

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

  1. 根据您的屏幕创建一个包。我们假设您有一个注册屏幕。然后创建一个包<your.main.package>.signupscreen
  2. 创建三类SignupActivity,SignupView(这是界面),SignupPresenter。
  3. 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 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