Java 如何使用Dagger2和MVP模式在模型文件中调用Presenter方法

Java 如何使用Dagger2和MVP模式在模型文件中调用Presenter方法,java,android,mvp,dagger-2,Java,Android,Mvp,Dagger 2,我正在尝试用Dagger2创建子结构,一切都很好 我的主要问题是在需要在模型文件中调用presenter方法时启动。让我说得更详细一些 正如您在我的模型文件中所看到的,我请求对服务器进行改造,并根据结果从presenter调用一个方法。因为模型将决定应该在presenter中使用哪个方法,并且presenter将根据选择的方法调用视图方法。但问题是,演示者通过调用构造函数来使用模型,但即使演示者是中间人,模型也不能使用演示者 下面的下部结构适用于MVP 谁有责任请求服务器演示者或模型 如果我的子

我正在尝试用Dagger2创建子结构,一切都很好

我的主要问题是在需要在模型文件中调用presenter方法时启动。让我说得更详细一些

正如您在我的模型文件中所看到的,我请求对服务器进行改造,并根据结果从presenter调用一个方法。因为模型将决定应该在presenter中使用哪个方法,并且presenter将根据选择的方法调用视图方法。但问题是,演示者通过调用构造函数来使用模型,但即使演示者是中间人,模型也不能使用演示者

  • 下面的下部结构适用于MVP
  • 谁有责任请求服务器演示者或模型
  • 如果我的子结构是正确的,那么模型应该如何使用Dagger2调用presenter文件
  • 这是我的MVP接口集群

    public interface IRegisterMVP {
    
        interface View extends IGeneralViewOps{
    
            void showWarning( String warningMessage );
    
            void openMainActivity();
        }
    
        interface Presenter {
    
            void setView( View view );
    
            void registerTriggered( ArrayMap< String, String > userParameters );
    
            void registerTriggered( EditText userName, EditText mailAddress, EditText password, EditText passwordRepeat );
    
            void notValidated( String warningMessage );
    
            void validate();
        }
    
        interface Model {
    
            void validateData( ArrayMap< String, String > userParameters );
    
        }
    
    是我的演讲者

    public class RegisterFragmentPresenter implements IRegisterMVP.Presenter {
    
    private IRegisterMVP.View mView;
    private IRegisterMVP.Model mModel;
    
    public RegisterFragmentPresenter( IRegisterMVP.Model mModel ) {
        this.mModel = mModel;
    }
    
    @Override
    public void setView( IRegisterMVP.View view ) {
        this.mView = view;
    
    }
    
    @Override
    public void registerTriggered( ArrayMap< String, String > userParameters ) {
        this.mModel.validateData( userParameters );
    
    }
    
    @Override
    public void registerTriggered( EditText userName, EditText mailAddress, EditText password, EditText passwordRepeat ) {
    
        ArrayMap< String, String > createViewValues = new ArrayMap<>( 4 );
        createViewValues.put( UserBussinessModel.USER_NAME, userName.getText().toString() );
        createViewValues.put( UserBussinessModel.USER_MAIL_ADDRES, mailAddress.getText().toString() );
        createViewValues.put( UserBussinessModel.USER_PASS, password.getText().toString() );
        createViewValues.put( UserBussinessModel.USER_PASS_REPEAT, passwordRepeat.getText().toString() );
    
        this.registerTriggered( createViewValues );
    }
    
    @Override
    public void notValidated( String warningMessage ) {
        this.mView.hideWaitingView();
        this.mView.showWarning( warningMessage );
    
    }
    
    @Override
    public void validate() {
        this.mView.hideWaitingView();
        this.mView.openMainActivity();
    
    }
    
    公共类RegisterFragmentPresenter实现IRegisterMVP.Presenter{
    私有iRegisterVP.View mView;
    私有iRegisterVP.modelmodel;
    公共RegisterFragmentPresenter(IRegisterMVP.Model mModel){
    this.mModel=mModel;
    }
    @凌驾
    公共void集合视图(IRegisterMVP.View){
    this.mView=视图;
    }
    @凌驾
    public void registerTriggered(ArrayMapuserParameters){
    this.mModel.validateData(userParameters);
    }
    @凌驾
    public void registerTriggered(EditText用户名、EditText邮箱地址、EditText密码、EditText密码重复){
    ArrayMapcreateViewValues=新的ArrayMap(4);
    createViewValues.put(UserBussinessModel.USER_NAME,userName.getText().toString());
    createViewValues.put(UserBussinessModel.USER\u MAIL\u ADDRES,mailAddress.getText().toString());
    createViewValues.put(UserBussinessModel.USER_PASS,password.getText().toString());
    createViewValues.put(UserBussinessModel.USER_PASS_REPEAT,passwordRepeat.getText().toString());
    this.registerTriggered(createViewValues);
    }
    @凌驾
    public void notValidated(字符串警告消息){
    this.mView.hideWaitingView();
    this.mView.showWarning(warningMessage);
    }
    @凌驾
    public void validate(){
    this.mView.hideWaitingView();
    this.mView.openMainActivity();
    }
    
    }

    这是我的商业模式文件

    public UserBussinessModel( Context context ) {
        this.mContext = context;
    
    }
    
    public UserBussinessModel( Context mContext, IRegisterMVP.Presenter mRegisterPresenter ) {
        this.mContext = mContext;
        this.mRegisterPresenter = mRegisterPresenter;
    }
    
    public UserBussinessModel( Context mContext, LoginMVP.Presenter mLoginPresenter ) {
        this.mContext = mContext;
        this.mLoginPresenter = mLoginPresenter;
    }
    
    @Override
    public void validateData( ArrayMap< String, String > userParameters ) {
      Call< MainModel< Fortune > > jsonObjectCall =    this.mFortuneService.getSpesificFortuneBasedOnUser( userUUID, fortune_id );
        jsonObjectCall.enqueue( new Callback< MainModel< Fortune > >() {
            @Override
            public void onResponse( Call< MainModel< Fortune > > call, Response< MainModel< Fortune > > response ) {
            // HOW SHOULD MODEL INVOKE THE PRESENTER METHOD IN ORDER TO ARRANGE VIEW FILES?
            }
    
            @Override
            public void onFailure( Call< MainModel< Fortune > > call, Throwable t ) {
             // HOW SHOULD MODEL INVOKE THE PRESENTER METHOD IN ORDER TO ARRANGE VIEW FILES?
            }
        } );
    }
    
    公共用户业务模型(上下文){ this.mContext=上下文; } 公共用户业务模型(上下文mContext、IRegisterMVP.Presenter、mRegisterPresenter){ this.mContext=mContext; this.mRegisterPresenter=mRegisterPresenter; } 公共用户业务模型(上下文mContext、LoginMVP.Presenter mLoginPresenter){ this.mContext=mContext; this.mLoginPresenter=mLoginPresenter; } @凌驾 public void validateData(ArrayMapuserParameters){ Call>jsonObjectCall=this.mforteService.getSpesificFortuneBasedOnUser(userUUID,Fortune\u id); jsonObjectCall.enqueue(新回调>(){ @凌驾 公共void onResponse(调用>调用,响应>响应){ //模型应该如何调用PRESENTER方法来排列视图文件? } @凌驾 失败时公开作废(调用>调用,可丢弃的t){ //模型应该如何调用PRESENTER方法来排列视图文件? } } ); }
    如果您对在Android中实现MVP感兴趣,请参阅

    关于你的问题:

    因为模型将决定应该在presenter中使用哪个方法,并且presenter将根据选择的方法调用视图方法

    这不是做MVP的通常方式。在MVP中,模型是被动的,演示者是代理

    (图表来源)

    根据上图,演示者操纵模型,而模型并不知道或关心演示者。当模型需要通知演示者状态更改事件时,可以通过演示者注册模型的回调来完成。这在蓝图示例中也很清楚:

    @Inject
    TasksPresenter(TasksRepository tasksRepository, TasksContract.View tasksView) {
        mTasksRepository = tasksRepository;
        mTasksView = tasksView;
    }
    
    演示者依赖于模型(任务存储库),但任务存储库不知道或不关心谁在使用它。虽然链接的示例没有显示从模型层传播到演示者的状态更改事件,但如果有,则可能通过在演示者层内注册回调来完成。如下所示:

    mTasksRepository.registerStateChangeEvent(this);
    
    同样,该示例还显示了与您类似的加载,并将其正确放置在演示者中:

    private void loadStatistics() {
        mStatisticsView.setProgressIndicator(true);
    
        // The network request might be handled in a different thread so make sure Espresso knows
        // that the app is busy until the response is handled.
        EspressoIdlingResource.increment(); // App is busy until further notice
    
        mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {
        //snip    
    

    因为
    mTasksRepository
    没有任何与视图或演示者相关的依赖关系,并且作为患者被演示者操纵,所以我们仍然保持关注点分离。

    在我研究Google Android架构蓝图之前,我使用模型文件是为了决定应用程序的行为,但据我所知,该模型应用于本地存储操作。但我不明白谁负责和服务器通信。主持人还是模特@大卫
    private void loadStatistics() {
        mStatisticsView.setProgressIndicator(true);
    
        // The network request might be handled in a different thread so make sure Espresso knows
        // that the app is busy until the response is handled.
        EspressoIdlingResource.increment(); // App is busy until further notice
    
        mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() {
        //snip