Android MVP - 调用服务器

问题描述 投票:1回答:4

我开始学习MVP,但我有一些与模型和演示者之间的沟通有关的问题,例如登录功能

  • Activity将获取所有字段,发送给演示者,演示者将验证,如果它是预期的一切,演示者将调用模型发送到服务器,但此调用可能需要几秒钟,所以我需要等待从服务器回调再次调用演示者,演示者调用该活动。

我的问题是:最好的方法是怎样做的?目前我在演示者中添加了一个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);
}}

谢谢,泰勒斯

java android interface mvp
4个回答
0
投票

再添一个回调

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

0
投票

你的解决方案是正确的,但最好使用MVVP。您必须检查很多可能导致应用程序崩溃的情况,例如组件生命周期。但是在MVVP中,没有必要检查这个条件。


0
投票

根据您的活动或片段,在验证后调用presenter.loginServerCallback()

loginServerCallback()LoginPresenter内,处理成功和错误并更新视图为view.loginSuccess()view.loginFailure("msg")


0
投票

使用这张图片:

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

© www.soinside.com 2019 - 2024. All rights reserved.