Может кто-нибудь сказать мне, правильно ли я использую 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
Вам повезло с этим? – bmurmistro
Боюсь, что нет :(На данный момент я отказался от Robospice и вместо этого привязываю стандартные задачи асинхронного цикла к жизненному циклу активности, если запрос запущен и активность умирает, я отменяю запрос. Не так прочен, но он работает для меня правильно –
Хорошо, спасибо за информацию. У меня есть аналогичная проблема http://stackoverflow.com/questions/27092185/how-to-recover-properly-recover-from-an-interupted-uncached-request-using-robosp Я думаю о раскомментировании spiceManager.getFromCache и поставке небольшого времени кеша для результата (20 секунд). Если пройдет 20 секунд, он должен просто вернуть нуль. Не идеально, но, вероятно, разумная работа. – bmurmistro