Операции с базами данных в IntentService приводят к остановке приложения, становятся невосприимчивыми и дают ANR
Я использую IntentService в диспетчере аварийных сигналов, чтобы запускать его каждые 15 секунд. Я должен постоянно отправлять большие данные на сервер и получать большой объем данных в ответ в фоновом режиме. Я должен следить за процессом:
-
Я читаю данные из базы данных через запросы.
-
Затем преобразование его в Json через архитектуру POJO.
-
Отправка этого JSON в запрос на сервер с помощью Retrofit Library.
-
Получение данных в ответ.
-
Вставка этих данных в мою базу данных через определенные запросы, если какие-либо обновления в базе данных.
Есть ли альтернативный подход? Поскольку я сталкиваюсь с ANR. Если данные меньше, то он работает нормально. Но по мере увеличения размера данных пользовательский интерфейс останавливается, и приложение становится невосприимчивым.
Ответы
Ответ 1
После большой борьбы, наконец, я получил решение:
Я просто использовал отдельный процесс для работы в службе намерения.
используя это в файле " Манифест "
<service android:name=".BackgroundSyncDataService"
android:process=":my_process">
</service>
Описание :
Префикс двоеточия перед именем указывает Android, что Служба является частной для своего объявления. Если двоеточие не используется, Служба будет глобальным процессом и может использоваться другими приложениями для Android.
Запуск службы в собственном процессе дает ей собственное адресное пространство памяти, и сборщик мусора виртуальной машины в этом процессе не влияет на процесс приложения.
Запуск службы в своем собственном процессе не будет блокировать приложение, если служба выполняет длительные операции в своем основном потоке.
Ответ 2
Чтобы избежать ANR, нужно помнить несколько ключевых моментов при использовании IntentService:
- Не выполняйте интенсивную работу в onCreate или onStartCommand - оба остаются линией пользовательского интерфейса
- Не выполняйте интенсивную работу в ResultReceiver
- Не запускайте свои собственные потоки в сервисе - он уже делает это сам
- Сделайте свою интенсивную работу в onHandleIntent
- Как спроектировать архитектуру так только данные, которые вы получаете данные, которые изменились
- Не переходите к другому процессу - поскольку у этого есть накладные расходы процессора и памяти (не подходит для ваших пользователей)
Другим решением является переход на другой тип Сервиса и запуск HandlerThread (или просто запуск самой службы из фонового потока - поскольку служба работает в потоке, который ее запустил)