2014-11-12 3 views
1

Может кто-нибудь сказать мне, правильно ли я использую PendingRequestListener (я использую библиотеку robospice для Android)? Вот пример моего кода:Как использовать addListenerIfPending

Я запускать и останавливать менеджер за гиперактивности: LoginActivty.java

private SpiceManager spiceManager = new SpiceManager(UncachedSpiceService.class); 

    @Override 
    protected void onStart() { 
     spiceManager.start(this); 
     super.onStart(); 
    } 

    @Override 
    protected void onStop() { 
     if (spiceManager.isStarted()) { 
      spiceManager.shouldStop(); 
     } 
     super.onStop(); 
    } 

    public SpiceManager getSpiceManager() { 
     return spiceManager; 
    } 

В LoginFragment.java В OnClick а «забыл пароль» кнопку I побудить пользователю ввести свой адрес электронной почты или идентификатор и нажмите отправить:

mEmailOrID = input.getText().toString(); 

if (AppStatus.getInstance(mContext).isOnline(mContext)) { 
    ((LoginActivity) getActivity()).getSpiceManager().execute(
      new RequestForgotPassword(mEmailOrID), 
      mEmailOrID, 
      DurationInMillis.ALWAYS_EXPIRED, 
      new ForgotPasswordRequestListener()); 
} else { 
    Toast.makeText(mContext, R.string.toast_error_web_connection, Toast.LENGTH_SHORT).show(); 
} 

Вот ForgotPasswordRequestListener()

public final class ForgotPasswordRequestListener implements PendingRequestListener<JSONObject> { 

    @Override 
    public void onRequestFailure(SpiceException spiceException) { 
     if (isAdded()) { 
      Toast.makeText(getActivity(), "Request failure", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onRequestSuccess(final JSONObject result) { 
     if (isAdded()) { 
      try { 
       JSONObject response = result.getJSONObject("response"); 
       if (response.getString("success").matches("1")) { 
        Toast.makeText(getActivity(), "An email has been sent to your account to assist in recovering your password", Toast.LENGTH_LONG).show(); 
       } else { 
        Toast.makeText(getActivity(), "We don't have any record of that ID or registered email, sorry! Please try again", Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void onRequestNotFound() { 
     //Called if the addListenerIfPending finds no pending request. 
     Toast.makeText(getActivity(), "NO REQUEST FOUND", Toast.LENGTH_LONG).show(); 
    } 
} 

LoginFragment содержит это перезапустить запрос, если необходимо:

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    if (savedInstanceState != null) { 
     mEmailOrID = savedInstanceState.getString(Constants.SpiceTags.LOGIN_FORGOT_PASS); 
    } 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    SpiceManager spiceManager = ((LoginActivity) getActivity()).getSpiceManager(); 
    spiceManager.addListenerIfPending(JSONObject.class, mEmailOrID, new ForgotPasswordRequestListener()); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putString(Constants.SpiceTags.LOGIN_FORGOT_PASS, mEmailOrID); 
} 

Вот фактический запрос, задержка 10 секунд, так что я есть возможность отладки и т.д.

public class RequestForgotPassword extends SpiceRequest<JSONObject> { 

    private String mEmailOrID; 

    public RequestForgotPassword(String emailOrID) { 
     super(JSONObject.class); 

     mEmailOrID = emailOrID; 
    } 

    @Override 
    public JSONObject loadDataFromNetwork() throws IOException { 
     Ln.d("Calling web service"); 

     ServerFunctions serverFunctions = new ServerFunctions(); 
     SystemClock.sleep(10000); 
     return serverFunctions.forgotPassword(mEmailOrID); 
    } 

} 

Я считаю, что этот код следующим образом образцы достаточно близко, и я должен был бы запустить запрос на забытый пароль, нажать кнопку «домой» и вернуться к нему через несколько минут, и запрос будет автоматически повторен, поскольку ключи кеша совпадают (в моем введите переменную экземпляра mEmailOrId). Вместо этого я получаю обратный вызов onRequestNotFound() каждый раз. Что я могу делать неправильно?

Вот ссылка на мои первоначальные мысли на Robospice Google Group page.

EDIT: Вот лог-код, после того как я ударил домой, пока запрос не ожидается. Поскольку вы видите, что ожидающий запрос есть, и вскоре после этого что-то убивает его, поэтому я не должен его правильно сохранять.

D//SpiceManager.java:326﹕ 15:26:21.719 main SpiceManager stopping. Joining 
V//SpiceManager.java:767﹕ 15:26:21.738 main Cleared listeners of all requests to launch 
D//SpiceManager.java:789﹕ 15:26:21.751 main Removing listeners of pending request : CachedSpiceRequest [requestCacheKey=rjhf, cacheDuration=-1, [email protected]] : 1 
D//RequestProgressManager.java:147﹕ 15:26:21.764 main Removing listeners of request : CachedSpiceRequest [requestCacheKey=rjhf, cacheDuration=-1, [email protected]] : 1 
V//SpiceManager.java:796﹕ 15:26:21.775 main Cleared listeners of all pending requests 
D//SpiceManager.java:265﹕ 15:26:21.788 SpiceManagerThread 2 Interrupted while waiting for new request. 
D//SpiceManager.java:271﹕ 15:26:21.796 SpiceManagerThread 2 SpiceManager request runner terminated. Requests count: 0, stopped true, interrupted false 
D//SpiceManager.java:339﹕ 15:26:21.805 main Runner join time (ms) when should stop 19 
V//SpiceManager.java:1221﹕ 15:26:21.812 main Unbinding from service start. 
V//SpiceManager.java:1225﹕ 15:26:21.819 main Unbinding from service. 
D//SpiceManager.java:1227﹕ 15:26:21.831 main Unbound from service : UncachedSpiceService 
D//SpiceManager.java:345﹕ 15:26:21.841 main SpiceManager stopped. 
D/FORGOT PASSWORD﹕ rjhf 
I/Choreographer﹕ Skipped 371 frames! The application may be doing too much work on its main thread. 
V//SpiceService.java:506﹕ 15:26:22.793 main Pending requests : 1 
V//SpiceService.java:511﹕ 15:26:22.802 main Start foreground 
V//SpiceService.java:495﹕ 15:26:22.855 main Pending requests : 1 
D//DefaultRequestRunner.java:151﹕ 15:26:24.140 Thread-59213 Network request call ended. 
D//DefaultRequestRunner.java:171﹕ 15:26:24.147 Thread-59213 Start caching content... 
D//RequestProgressManager.java:82﹕ 15:26:24.159 Thread-59213 Sending progress WRITING_TO_CACHE 
D//SpiceServiceListenerNotifier.java:146﹕ 15:26:24.167 Thread-59213 Message queue is Handler (android.os.Handler) {439d1b68} 
V//DefaultRequestListenerNotifier.java:131﹕ 15:26:24.185 main Notifying 0 listeners of progress [email protected]ec90 
D//RequestProgressManager.java:82﹕ 15:26:24.210 Thread-59213 Sending progress COMPLETE 
D//SpiceServiceListenerNotifier.java:146﹕ 15:26:24.219 Thread-59213 Message queue is Handler (android.os.Handler) {439d1b68} 
V//DefaultRequestListenerNotifier.java:131﹕ 15:26:24.234 main Notifying 0 listeners of progress [email protected]ba60 
D//SpiceServiceListenerNotifier.java:146﹕ 15:26:24.240 Thread-59213 Message queue is Handler (android.os.Handler) {439d1b68} 
V//DefaultRequestListenerNotifier.java:166﹕ 15:26:24.255 main Notifying 0 listeners of request success 
V//RequestProgressManager.java:161﹕ 15:26:24.275 Thread-59213 Removing CachedSpiceRequest [requestCacheKey=rjhf, cacheDuration=-1, [email protected]] size is 1 
D//RequestProgressManager.java:91﹕ 15:26:24.287 Thread-59213 Sending all request complete. 
V//SpiceService.java:495﹕ 15:26:24.344 Thread-59213 Pending requests : 0 
+0

Вам повезло с этим? – bmurmistro

+0

Боюсь, что нет :(На данный момент я отказался от Robospice и вместо этого привязываю стандартные задачи асинхронного цикла к жизненному циклу активности, если запрос запущен и активность умирает, я отменяю запрос. Не так прочен, но он работает для меня правильно –

+0

Хорошо, спасибо за информацию. У меня есть аналогичная проблема http://stackoverflow.com/questions/27092185/how-to-recover-properly-recover-from-an-interupted-uncached-request-using-robosp Я думаю о раскомментировании spiceManager.getFromCache и поставке небольшого времени кеша для результата (20 секунд). Если пройдет 20 секунд, он должен просто вернуть нуль. Не идеально, но, вероятно, разумная работа. – bmurmistro

ответ

0

addListenerIfPending() только приложить прослушиватель для запроса, ответ на который еще не придет. Но ответ на ваш запрос, вероятно, придет, чтобы приложение wile было на фоновом режиме, поэтому вы можете получить его из кеша. Как говорит @bmurmistro, посмотрите на How to recover properly recover from an interupted uncached request using RoboSpice, это аналогичная проблема.

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

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