#xamarin.forms #prism
Вопрос:
Кто-нибудь знает, нужно ли мне вручную утилизировать контейнер для инъекций зависимостей, который используется в Prism.Формы, когда приложение (Xamarin Android) завершается?
Проблема:
Я регистрирую одноэлементную службу в Prism. RegisterServices
Метод форм. Сама служба singleton подписывается на некоторые классические события .NET ( =) и реализует IDisposable, который используется для отмены подписки (-=) на упомянутые события. Пока все хорошо. Все работает нормально. Когда я запускаю Android — часть Xamarin.Формирует приложение, затем вернитесь (кнопка «Назад» Android), чтобы приложение снова закрылось, снова запустите приложение — > это приведет к нескольким подпискам на события. Dispose никогда нигде не запускается, поэтому в службе одноэлементных сообщений не выполняется отмена подписки на события. Это в конечном итоге приводит к утечкам памяти.
Предлагаемое решение (подлежит проверке)
Я переопределяю void OnDestroy
метод MainActivity
и оттуда вызываю App.Container.Dispose (), чтобы контейнер DI Prims удалялся при завершении работы приложения для Android. Это одноразовое использование контейнера DI приводит к тому, что утилизация вызывается в ранее упомянутой одноэлементной службе.
А ты как думаешь? Я никогда не видел, чтобы кто-то делал это, но это решает важную проблему. Как бы вы решили эту проблему?
Комментарии:
1. Если приложение будет уничтожено при нажатии кнопки «Назад», подписки на события исчезнут вместе с ним. Вы уверены, что подписываетесь на события в правильном месте, то есть когда создается приложение, а не когда создается или возобновляется действие или приложение возобновляется…?
2. Это то, что я предполагал все эти годы… В этой конкретной ситуации я подписываюсь на события в одноэлементном классе. Этот класс зарегистрирован во время запуска в контейнере IoC Prism (в моем случае DryIoc). Я бы предположил, что — когда приложение для Android закрывается с помощью кнопки «Назад», корневой процесс и вся его память удаляются. Я могу создать небольшой пример приложения, если это поможет?
3. закрытие приложения (кнопка «Назад», кнопка «Домой») не означает, что оно будет немедленно уничтожено… он может сохраняться в течение нескольких часов, если устройство простаивает, и если вы нажмете на его значок, он будет восстановлен. Взгляните на жизненный цикл приложения Android, он почти так же сложен, как жизненный цикл действия или фрагмента… графическая иллюстрация: upload.wikimedia.org/wikipedia/en/f/f6/…
4. @Haukinger, я бы по-другому понял модель жизненного цикла: либо приложение основано (кнопка «Домой»), либо уничтожено (кнопка «назад»; или вручную закрыв приложение). Если приложение фоновое, не создается никакого нового действия — все используется повторно. Когда приложение закрывается и перезапускается, все воссоздается заново (включая MainActivitiy, приложение Xamarin Forms, контейнер IoC и т. Д.), Но это — очевидно — не тот случай. Очень неприятно.
5. в Android (как у пользователя), к сожалению, нет такого понятия, как «закрытие приложения», к сожалению, только фон, а затем случайное завершение ОС… Я согласен, что это действительно раздражает и чрезмерно сложно, особенно если вы хотите, чтобы приложение работало в фоновом режиме. Удачи в попытках убедиться, что он не будет прекращен в тот или иной момент времени…