我开始学习MVP,但我有一些与模型和演示者之间的沟通有关的问题,例如登录功能
我的问题是:最好的方法是怎样做的?目前我在演示者中添加了一个loginServerCallback()
并将参考传递给模型,因此当模型完成时,我在演示者中调用loginServerCallback()
并且演示者分析响应并在视图中调用该方法。我这样做了吗?
public interface LoginMVP {
interface View {
void loginSuccess();
void loginFailured(String message);
}
interface Presenter {
void validateFields(String email, String password);
void loginServerCallback();
}
interface Model {
void loginServer(String email, String password);
}}
谢谢,泰勒斯
再添一个回调
public interface LoginMVP {
interface View {
void showLoadingIndicator(boolean active);
void loginSuccess();
void loginFailured(String message);
}
interface Presenter {
void validateFields(String email, String password);
void loginServerCallback();
}
interface OnLoginCallBack{
void onSuccess();
void onError();
}
interface Model {
void loginServer(String email, String password);
}
}
并在这样的演示者中调用登录方法
public void doLogin(String userName, String password) {
view.showLoadingIndicator(true);
modal.loginServer(userName, password, new LoginMVP.OnLoginCallBack() {
@Override
public void onSuccess() {
view.showLoadingIndicator(false);
view.loginSuccess();
}
@Override
public void onError() {
view.showLoadingIndicator(false);
view.loginFailured("SomeError");
}
});
}
你的解决方案是正确的,但最好使用MVVP。您必须检查很多可能导致应用程序崩溃的情况,例如组件生命周期。但是在MVVP中,没有必要检查这个条件。
根据您的活动或片段,在验证后调用presenter.loginServerCallback()
。
在loginServerCallback()
的LoginPresenter
内,处理成功和错误并更新视图为view.loginSuccess()
和view.loginFailure("msg")
使用这张图片:
1.您可以使用活动和片段作为视图。
public class AuthenticationActivity extends BaseActivity implements AuthenticationPatternFragment.NavigateToDashboardCallback,
AuthenticationPasswordFragment.NavigateToDashboardCallback {}
public class AuthenticationPasswordFragment extends Fragment implements AuthenticationContract.View {}
- 对于活动量较小的人来说更好,并且实现组件只是导航抽屉,工具栏,...在活动和片段中的其他人。
2.使用类作为连接到存储库的演示者。
3.使用类作为get,set,getAll的存储库,更新本地数据库和远程服务器中的数据。
public class AuthenticationRepository implements IAuthenticationRepository {
private IAuthenticationRepository mAuthenticationRealmRepository;
private IAuthenticationRepository mAuthenticationRestRepository;
public AuthenticationRepository(IAuthenticationRepository restRepository, IAuthenticationRepository realmRepository) {
mAuthenticationRestRepository = restRepository;
mAuthenticationRealmRepository = realmRepository;
}
private AuthenticationRepository() {
}
@Override
public void get(CallRepository<Authentication> callRepository) {
mAuthenticationRealmRepository.get(callRepository);
}
@Override
public void update(Authentication authentication, CallRepository<Authentication> callRepository) {
mAuthenticationRealmRepository.update(authentication, callRepository);
}
@Override
public void get(Integer identifier, CallRepository<Authentication> callRepository) {
mAuthenticationRealmRepository.get(identifier, callRepository);
}
@Override
public void getAll(CallRepository<List<Authentication>> callRepository) {
mAuthenticationRealmRepository.getAll(callRepository);
}
}
4.将包创建为可以导入其上所有模型的模型。
5.您可以创建ClassNameContract作为接口来定义另外两个接口作为视图和演示者,如下所示:
public interface AuthenticationContract {
interface View extends BaseView<Presenter>{
}
interface Presenter extends BasePresenter{
}
---------- You can use this example for better review in MVP