2017-03-31 49 views
1

我正在尝试使用Dagger2创建子结构,并且eveything正常工作。如何使用Dagger2和MVP模式调用模型文件中的Presenter方法

我的主要问题是当我需要在模型文件中调用演示者方法时启动。让我给更多的细节。

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

  1. 下面的这个子结构适用于MVP。
  2. 谁有责任请求服务器演示者或模型?
  3. 如果我的子结构是正确的,Model应该如何用Dagger2调用演示文件文件?

这是我的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); 

    } 

这是我的模块

@Module 
public class UserOperationsModule { 

    @Provides 
    public IRegisterMVP.Presenter provideRegisterPresenter(IRegisterMVP.Model model){ 
     return new RegisterFragmentPresenter(model); 

    } 

    @Provides 
    public IRegisterMVP.Model provideRegisterModel(Context context, IRegisterMVP.Presenter presenter){ 
     return new UserBussinessModel(context); 

    } 

} 

这是我的演示

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(); 

} 

}

而且这是我的商业模式文件

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

回答

1

如果你有兴趣在Android的实施MVP,请参阅Google Android Architecture Blueprints

关于你的问题:

因为模型将决定哪些方法应该在主持人根据选用的方法演示将调用视图的方法来工作,。

这不是做MVP的常用方法。在MVP的模式是被动的,主持人是代理。

model view presenter

(图从MVP Wikipedia page

如根据上面的图中,演示者操纵模型,该模型不知道或不关心的主持人。当它是必要的模型,通知它是通过做演示从模型回调注册状态更改事件的主持人。这也是在蓝图例如明确:

@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不采取相关的视图的任何依赖关系或主持人,并由主持人作为患者操纵,我们仍然保持关注点分离。

+0

Waow。多好的解释 –

+0

在我研究Google Android体系结构蓝图之前,我使用了Model文件,以便确定应用程序的行为方式,但据我了解,该模型应该用于本地存储操作。但我无法理解谁负责与服务器通信。演示者或模型? @大卫 –