Запрос Robospice никогда не заканчивается, если приложение переходит в фоновый режим, а затем переходит на передний план?

Я разрабатываю приложение с использованием библиотеки RoboSpice для вызова REST API. С библиотекой все работает нормально, кроме одного. Я не использую кеширование, доступное в RoboSpice, поэтому все запросы выполняются без кеширования. Теперь, когда выполняется какой-либо запрос и пользователь нажимает кнопку «Домой», вызывается onStop (), где вызывается shouldStop () диспетчера специй, который отменяет регистрацию всех прослушивателей запросов для уведомления. Когда приложение снова переходит на передний план, обновление пользовательского интерфейса не происходит, поскольку слушатели не были уведомлены.

Я не хочу использовать Cache, который предлагает Robospice. Есть ли другой способ получать уведомления об обновлении пользовательского интерфейса без использования кеша?


person thefrugaldev    schedule 13.01.2014    source источник


Ответы (1)


Это явно невозможно с RoboSpice, и действительно, на то есть веская причина: это было бы очень плохой идеей.

Когда ваша активность умирает (onStop), Android хочет собрать мусор для своего экземпляра. И для этого на него не должно ничего ссылаться. Вот почему RS требует удаления всех слушателей. Обычно слушатели содержат ссылку на активность (как внутренние классы), и лучшее достижение RS - позволить активности умереть должным образом и собрать мусор.

Итак, выполнение того, что вы хотите, явно приведет к утечке памяти и, более того, приведет к сбоям в большинстве случаев: когда действие больше не отображается, вы хотели бы обновить его пользовательский интерфейс? Выглядит немного неловко, правда?

Возможно, самым простым было бы использовать очень ограниченный кеш или просто выполнять все ваши запросы каждый раз, когда ваши действия входят в onStart.

person Snicolas    schedule 15.01.2014
comment
Я согласен с тем, что RS делает это не зря. Но представьте, что был сделан запрос, отображается диалоговое окно прогресса, и пользователь нажимает кнопку «Домой». Вызов REST будет выполнен правильно, и когда пользователь запустит приложение, диалоговое окно прогресса не исчезнет, ​​потому что пользовательский интерфейс не обновляется, поскольку слушатели были разрегистрированы. В любом случае, похоже, что использование кеша - единственный способ с RS в настоящее время. - person thefrugaldev; 16.01.2014
comment
Другой способ - вызвать spiceManager.shouldStop () в onDestroy и запустить spicemanager в onCreate (). Поскольку onDestroy () - это последний вызов, который получит действие, если его убьют. - person thefrugaldev; 16.01.2014
comment
@mobiledev, не думаю, что второе решение лучше. Связывание службы действительно сложно, и предпочтительным местом является использование пары onStart / onStop. Возможно, вам будет интересно выполнить запрос от службы, а не действие. - person Snicolas; 16.01.2014
comment
Я думаю, что RS уже делает запрос через Сервис. В любом случае, посмотрю, смогу ли я использовать кеш. - person thefrugaldev; 16.01.2014
comment
Конечно, есть, но контекст запуска также может быть Сервисом, а не только действием или фрагментом. Таким образом, у вас будет более длительный жизненный контекст для выполнения вашего запроса и живых слушателей. Сервис может, например, обновлять уведомление, показывая прогресс. - person Snicolas; 16.01.2014
comment
@mobiledev ты знаешь, как пользоваться кешем? мы должны использовать getSpiceManager (). getFromCache (Contributor.List.class, github, DurationInMillis.ONE_MINUTE, new ListContributorRequestListener ()); в onResume? у меня не работает :( в модифицированном RC, нажмите на уведомление, и это действие не запускается !! - person LOG_TAG; 29.04.2014
comment
@LOG_TAG, что вы имеете в виду, говоря, что не стреляете? Методы слушателя не вызываются? - person Snicolas; 29.04.2014
comment
@snicolas нажмите на уведомление! (Ожидаемое намерение), когда действие закрывается до того, как приложение, отвечающее за н / б, получит уведомление, нажмите на это уведомление, ничего не происходит! Затем нажатие на недавнюю активность приложений открывается без каких-либо данных! - person LOG_TAG; 29.04.2014
comment
Таким образом, в случае, если я публикую или редактирую что-то, что обычно не нужно кэшировать (а затем показываю индикатор выполнения - ›активность остановлена ​​-› запрос завершен - ›действие началось), нет никакого способа узнать, было ли это успешным / завершено без использования кеша? - person fikr4n; 29.01.2017