2014-01-13 1 views
5

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

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

ответ

4

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

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

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

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

+1

Я согласен с тем, что RS делает это по причине. Но представьте, что был сделан запрос, и отображается диалоговое окно прогресса, и пользователь нажимает кнопку «домой». Вызов REST будет проходить должным образом, и когда пользователь запустит приложение, диалог прогресса не исчезнет, ​​потому что пользовательский интерфейс не обновляется, поскольку слушатели были незарегистрированы. В любом случае, похоже, что использование кеша - единственный способ с RS в настоящее время. – mobiledev

+0

Другим способом может быть вызов spiceManager.shouldStop() в onDestroy и запуск spicemanager в onCreate(). Поскольку onDestroy() является последним призывом к действию, если он будет убит. – mobiledev

+0

@mobiledev, я не думаю, что второе решение лучше. Обязательное связывание действительно сложно, и предпочтительным местом является использование пары onStart/onStop. Возможно, вы заинтересованы в выполнении запроса от службы вместо активности. – Snicolas