Как вернуть данные в активность, которая была уничтожена Android - PullRequest
0 голосов
/ 12 февраля 2019

Название не очень хорошее, пожалуйста, прочитайте ниже, чтобы лучше понять мою проблему

У меня есть приложение Android, одна из его задач занимает много времени и часто занимает от 2 до 5 минут.... эта задача выполняется фоновым сервисом, который ссылается на активность стартера.

99% пользователей не хотят все это время ждать, глядя на панель загрузки, и просто открывают другое приложение иличто-то вроде ... что может привести к android destroying ссылочной деятельности ...

Игнорирование утечки контекста этой истории ... моя проблема:

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

Так что, когда пользователь повторно открывает приложение, последнее известное состояниеэтим действием является «загрузка», поэтому она продолжает загружаться вечно ... (или повторите попытку, чтобы выполнить задачу еще раз, что приведет к еще 5 минутам ожидания и т. д.)

как мне избежать этой ситуации?

============== update =================

После получения очень хорошего ответа, который, вероятно, решитБольшинство проблем, таких как моя, я решил добавить больше информации, чтобы разрешить мою проблему.

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

Так что я не могу сохранить результат и верю, что он действителен при следующем запуске

Я знаю этот протоколнуждается в улучшении, но собираюсь изменить архитектуру, поэтому я хотел бы знать, есть ли у кого-нибудь идеи, как справиться с его актуальными требованиями

1 Ответ

0 голосов
/ 12 февраля 2019

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

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

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

Также часто используется временная метка, когда данные хранились в вашем кеше, поэтому, если интервал слишком велик, вы можете либо:

  • Показать устаревшиеданные во время выполнения фоновой задачи.Фоновая задача завершает работу и сохраняет новые данные в кэш-памяти, а затем уведомляет Activity о появлении новых данных.Активность обновляется с новыми данными.

  • Не показывать устаревшие данные, вместо этого вы стираете кэш старых данных и запускаете фоновую задачу.

По сути, в этом решении ваша служба просто хранит значения, рассчитанные в хранилище, будь то база данных, SharedPreferences, файлы и т. Д.

Вы избегаетевам нужно, чтобы ваш Сервис возвращал значения в Activity, поскольку нет гарантии, что Activity все еще существует.Вместо этого Служба только уведомляет Активность о том, что она добавила недавно обновленные данные в хранилище, поэтому, если Активность все еще существует, она будет обновляться без проблем.И если активность уже уничтожена, то при следующем запуске она просто получит данные.

...