У меня есть простой фрагмент, который обрабатывает логины для моего приложения. Поскольку я имею дело с запросами входа, я не хочу их кэшировать. Эта стратегия работает нормально до тех пор, пока я не введу временное изменение или изменение ориентации в середине запроса. Когда пользователь нажимает кнопку входа в систему, я показываю ProgressDialog. Это исчезает, когда я получаю ответ (успех или неудача). Если я перейду на главный экран и вернусь в приложение в середине запроса на вход, мой слушатель никогда не получит уведомление, и в результате мой ProgressDialog не будет уволен, и мое приложение будет заморожено. Я попытался добавить spiceManager.getFromCache в мой onStart. Это помогает, но результат всегда равен нулю, когда приложение пытается восстановить ... это имеет смысл, поскольку результаты не кэшируются. Каков правильный способ настройки моего слушателя для уведомления в этом сценарии?Как восстановить надлежащим образом восстановленный файл из переполненного неподписанного запроса с использованием RoboSpice
// 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);
}
}
}
Вот как я его решил. Это требует немного больше кодирования в первый раз, но вы получите простой способ проверить, запущен ли запрос: http://stackoverflow.com/questions/25681395/robospice-addlistenerifpending-how-do-i -know-если-reqest-был обретенной/32111229 # 32111229 – Deinlandel