Android MVP - вызывает сервер - PullRequest
0 голосов
/ 17 сентября 2018

Я начал изучать 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);
}}

Спасибо, Фалес

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Используйте эту картинку:

Use this picture

1.В качестве вида вы можете использовать деятельность и фрагмент.

public class AuthenticationActivity extends BaseActivity implements AuthenticationPatternFragment.NavigateToDashboardCallback,
    AuthenticationPasswordFragment.NavigateToDashboardCallback {}

public class AuthenticationPasswordFragment extends Fragment implements AuthenticationContract.View {}

- лучше для вас, чтобыимеет небольшую активность и реализует компонент только ящик навигации, панель инструментов, .. в действии и другие фрагменты.

2.используйте класс в качестве докладчика для подключения к хранилищу.

3.useкласс в качестве хранилища для 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{

}

---------- Выможете использовать этот пример для лучшего обзора в MVP

0 голосов
/ 17 сентября 2018

Из вашей деятельности или фрагмента звоните presenter.loginServerCallback() после проверки.

Внутри loginServerCallback() in LoginPresenter обработайте успех и ошибку и обновите представление как view.loginSuccess() и view.loginFailure("msg")

0 голосов
/ 17 сентября 2018

добавить еще один обратный вызов

 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 голосов
/ 17 сентября 2018

Ваше решение правильное, но лучше использовать MVVP.Вы должны проверить множество условий, которые могут вызвать сбой вашего приложения, таких как жизненный цикл компонента.Но в MVVP нет необходимости проверять эти условия.

...