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