我正在嘗試使用Dagger2創建子結構,並且eveything正常工作。如何使用Dagger2和MVP模式調用模型文件中的Presenter方法
我的主要問題是當我需要在模型文件中調用演示者方法時啓動。讓我給更多的細節。
正如你在我的模型文件中看到的,我向服務器請求改進並基於結果,我應該從演示者調用一個方法。由於模型將決定在演示者中應該使用哪種方法,並且根據選擇的方法,演示者將調用視圖方法。但問題是,演示者通過在構造函數中調用來使用模型,但即使演示者是中間人,模型也不能使用演示者。
- 下面的這個子結構適用於MVP。
- 誰有責任請求服務器演示者或模型?
- 如果我的子結構是正確的,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?
}
});
}
Waow。多好的解釋 –
在我研究Google Android體系結構藍圖之前,我使用了Model文件,以便確定應用程序的行爲方式,但據我瞭解,該模型應該用於本地存儲操作。但我無法理解誰負責與服務器通信。演示者或模型? @大衛 –