Как robospice управляет жизненным циклом деятельности?

Я ищу технический ответ на то, как библиотека роботов android управляет жизненным циклом деятельности. На начальной странице:

https://github.com/octo-online/robospice/wiki/Starter-Guide

"В качестве внутреннего класса вашей деятельности (или другого контекста) добавьте RequestlListener, который обновит ваш пользовательский интерфейс. Не беспокойтесь о утечке памяти, RoboSpice управляет жизненным циклом вашей деятельности."

Мой вопрос в том, как robospice автоматически обновляет прослушиватели запросов, чтобы он все еще мог вызвать правильный слушатель с правильным контекстом после поворота и после того, как активность была уничтожена и воссоздана как новый экземпляр?

Я пытался перепроектировать исходный код, но еще не нашел ответа:

https://github.com/octo-online/robospice

Ответ 1

@Выберите шанс сделать Cha. То, что вы говорите, совершенно прав. RS был разработан с учетом этой конкретной потребности: управление сетевыми запросами и жизненными циклами деятельности.

@craigrs84. В основном, что происходит с RS, заключается в том, что при обработке запроса его слушатели будут вызваны до тех пор, пока активна соответствующая активность. Если активность больше не активна, все ее слушатели отключены от RS, и они не будут уведомлены.

Основная цель RS заключается в том, чтобы убедиться, что утечка памяти отсутствует: ваша деятельность, если она должна умереть, умрет и будет собрана мусор, RS не содержит никакой твердой ссылки на нее, которая предотвратила сбор мусора, Это действительно основная идея RoboSpice.

Если вы хотите, чтобы новый экземпляр вашей активности был подгружен в ожидающий запрос (например, вы выполняете запрос, затем поворачиваете устройство, а затем получаете новый экземпляр своей активности и хотите, чтобы новый экземпляр получил результат запроса, выполненного предыдущим экземпляром), что возможно с помощью RS.

В таком случае используйте метод spiceManager.addListenerIfPending в начале, сразу после вызова spiceManager.start(..). Это не будет выполнять новый запрос, но повторно подключите нового прослушивателя к ожидающему запросу. Если запрос не ожидается, он ничего не сделает.

Ответ 2

Короткий ответ, по моему опыту, заключается в том, что он этого не делает.

Например, если вы не вызываете SpiceManager.shouldStop() и выполняете запрос, ссылка на RequestListener по-прежнему сохраняется, и вы можете столкнуться с утечкой памяти, поскольку она пытается обновить все, что указано в ней, если ваша активность/Фрагмент/Сервис больше не существует.