2014-11-23 5 views
3

У меня есть простой фрагмент, который обрабатывает логины для моего приложения. Поскольку я имею дело с запросами входа, я не хочу их кэшировать. Эта стратегия работает нормально до тех пор, пока я не введу временное изменение или изменение ориентации в середине запроса. Когда пользователь нажимает кнопку входа в систему, я показываю 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); 
     } 

    } 
} 
+0

Вот как я его решил. Это требует немного больше кодирования в первый раз, но вы получите простой способ проверить, запущен ли запрос: http://stackoverflow.com/questions/25681395/robospice-addlistenerifpending-how-do-i -know-если-reqest-был обретенной/32111229 # 32111229 – Deinlandel

ответ

3

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

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(). В противном случае возвратите null.

spiceManager.getFromCache(AccessTokenResponse.class, "your_cache_key", DurationInMillis.ALWAYS_RETURNED, new AccessTokenResponseRequestListener()); 

 Смежные вопросы

  • Нет связанных вопросов^_^