2014-09-10 5 views
2

Мне нужно реализовать довольно популярный шаблон поведения приложения - дать возможность пользователю повторить неудавшиеся запросы. Прямо сейчас я ломаю неудачный запрос с SpiceServiceListener и показывает диалог, в котором пользователь может нажать кнопку «Повторить». К сожалению, использование одного и того же объекта CachedSpiceRequest с SpiceManager.execute() не дает желаемого поведения, поскольку RS удаляет все прослушиватели запросов от mapRequestToLaunchToRequestListener, если запрос не был успешным. Таким образом, запрос может работать нормально, но он не будет возвращать какую-либо информацию в мою деятельность.Robospice. Повторить запрос с запросом по запросу

Есть ли простой способ (без изменения кода библиотеки) реализовать это?

+0

Похоже, что удаление слушателей - не единственная проблема. 'SpiceRequest' имеет много« переменных состояния »(' isCanceled', 'future',' progress'), поэтому повторное использование без надлежащей повторной инициализации таких переменных может привести к неожиданным результатам. – Deinlandel

+0

Пожалуйста, поделитесь, если вы нашли решение, мне нужно повторить попытку в случае истечения токена OAuth. – BornToCode

+0

@BornToCode, пожалуйста, проверьте мой ответ – Divers

ответ

0

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

getSpiceManager().execute(r, new RequestListener<CountProfiles>() { 
     @Override 
     public void onRequestFailure(SpiceException spiceException) { 
      if (act.getSupportFragmentManager().findFragmentByTag("network_problem") == null) { 
       NetworkProblemDialogFragm.newInstance(r, this).show(act.getSupportFragmentManager(), "network_problem"); 
      } else { 
       ((NetworkProblemDialogFragm) act.getSupportFragmentManager().findFragmentByTag("network_problem")).setSpiceRequest(r); 
       ((NetworkProblemDialogFragm) act.getSupportFragmentManager().findFragmentByTag("network_problem")).setRequestListener(this); 
      } 
     } 

     @Override 
     public void onRequestSuccess(CountProfiles countProfiles) { 
     } 
    }); 

NetworkProblemDialogFragm является DialogFragment с кнопку Retry, по нажатию на эту кнопку, я повторно выполнить запрос не удалось, используя данную RequestListener.

Не очень красивое решение, но похоже, что нет лучшего.