2017-03-31 46 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文件,以便確定應用程序的行爲方式,但據我瞭解,該模型應該用於本地存儲操作。但我無法理解誰負責與服務器通信。演示者或模型? @大衛 –