Как правильно восстановить прерванный некэшированный запрос с помощью RoboSpice

У меня есть простой фрагмент, который обрабатывает логины для моего приложения. Поскольку я имею дело с запросами на вход, я не хочу их кэшировать. Эта стратегия работает нормально, пока я не ввожу приостановку или изменение ориентации в середине запроса. Когда пользователь нажимает кнопку входа в систему, я отображаю ProgressDialog. Это исчезает, когда я получаю ответ (успех или неудача). Если я перейду на главный экран, а затем вернусь в приложение в середине запроса на вход, мой Listener никогда не получит уведомление, и в результате мой ProgressDialog не будет отклонен, а мое приложение заморожено. Я попытался добавить spiceManager.getFromCache в свой onStart. Это помогает, но результат всегда нулевой, когда приложение пытается восстановить... это имеет смысл, поскольку результаты не кэшируются. Как правильно настроить моего слушателя для получения уведомлений в этом сценарии?

// using Jackson2SpringAndroidSpiceService

public void onStart() {
    super.onStart();
    spiceManager.start(getActivity());
    spiceManager.addListenerIfPending(AccessTokenResponse.class, null,
            new AccessTokenResponseRequestListener());

    //spiceManager.getFromCache(AccessTokenResponse.class,
    //        null, DurationInMillis.ALWAYS_EXPIRED,
    //        new AccessTokenResponseRequestListener());
}


private void performRequest(String username, String password) {
    progressDialog = ProgressDialog.show(getActivity(), "", "Logging in...", true);
    LoginFragment.this.getActivity().setProgressBarIndeterminateVisibility(true);
    LoginRequest request = new LoginRequest(username, password);
    spiceManager.execute(request, null, DurationInMillis.ALWAYS_EXPIRED, new AccessTokenResponseRequestListener());
}


private class AccessTokenResponseRequestListener implements RequestListener<AccessTokenResponse> {

    @Override
    public void onRequestFailure(SpiceException e) {
        //update your UI
        if(progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        buttonLogin.setEnabled(true);
        Log.e(TAG, "Login unsuccessful");
        if(e.getCause() instanceof HttpClientErrorException)
        {
            HttpClientErrorException exception = (HttpClientErrorException)e.getCause();
            if(exception.getStatusCode().equals(HttpStatus.BAD_REQUEST))
            {
                Log.e(TAG, "Login unsuccessful");
                Toast.makeText(getActivity().getApplicationContext(),
                        "Wrong username/password combo!",
                        Toast.LENGTH_LONG).show();
            }
            else
            {
                Toast.makeText(getActivity().getApplicationContext(),
                        "Login unsuccessful! If the problem persists, please contact support.",
                        Toast.LENGTH_LONG).show();
            }
        } else {
            Toast.makeText(getActivity().getApplicationContext(),
                "Login unsuccessful! If the problem persists, please contact support.",
                Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onRequestSuccess(AccessTokenResponse accessToken) {
        //update  UI
        if(progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        buttonLogin.setEnabled(true);

        if (accessToken != null) { 
            OnAuthenticatedListener listener = (OnAuthenticatedListener) getActivity();
            listener.userLoggedIn(editTextUsername.getText().toString(), accessToken);
        }

    }
}

person bmurmistro    schedule 23.11.2014    source источник
comment
Вот как я это решил. В первый раз требуется немного больше кода, но вы получите простой способ проверить, выполняется ли запрос: stackoverflow.com/questions/25681395/   -  person Deinlandel    schedule 20.08.2015


Ответы (1)


Используйте кеш. Выполнить запрос с некоторым ключом кеша

spiceManager.execute(request, "your_cache_key", DurationInMillis.ALWAYS_EXPIRED, new AccessTokenResponseRequestListener());

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

@Override
public void onRequestFailure(SpiceException e) {
    ....
    spiceManager.removeDataFromCache(AccessTokenResponse.class);
    ....
}

@Override
public void onRequestSuccess(AccessTokenResponse accessToken) {
    if (accessToken == null) {
        return;
    }
    ....
    spiceManager.removeDataFromCache(AccessTokenResponse.class);
    ....
}

В onStart попробуйте получить кешированный ответ, если вы переключились на другое действие и теперь вернулись к предыдущему действию. Этот ответ возврата, который приходит после вызова spiceManager.shouldStop(). В противном случае вернуть ноль.

spiceManager.getFromCache(AccessTokenResponse.class, "your_cache_key", DurationInMillis.ALWAYS_RETURNED, new AccessTokenResponseRequestListener());
person viduka    schedule 25.11.2014