Операции с базами данных в IntentService приводят к остановке приложения, становятся невосприимчивыми и дают ANR

Я использую IntentService в диспетчере аварийных сигналов, чтобы запускать его каждые 15 секунд. Я должен постоянно отправлять большие данные на сервер и получать большой объем данных в ответ в фоновом режиме. Я должен следить за процессом:

  1. Я читаю данные из базы данных через запросы.

  2. Затем преобразование его в Json через архитектуру POJO.

  3. Отправка этого JSON в запрос на сервер с помощью Retrofit Library.

  4. Получение данных в ответ.

  5. Вставка этих данных в мою базу данных через определенные запросы, если какие-либо обновления в базе данных.

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

Ответы

Ответ 1

После большой борьбы, наконец, я получил решение:

Я просто использовал отдельный процесс для работы в службе намерения.

используя это в файле " Манифест "

 <service android:name=".BackgroundSyncDataService"
        android:process=":my_process">
  </service>

Описание :

Префикс двоеточия перед именем указывает Android, что Служба является частной для своего объявления. Если двоеточие не используется, Служба будет глобальным процессом и может использоваться другими приложениями для Android.

Запуск службы в собственном процессе дает ей собственное адресное пространство памяти, и сборщик мусора виртуальной машины в этом процессе не влияет на процесс приложения.

Запуск службы в своем собственном процессе не будет блокировать приложение, если служба выполняет длительные операции в своем основном потоке.

Ответ 2

Чтобы избежать ANR, нужно помнить несколько ключевых моментов при использовании IntentService:

  • Не выполняйте интенсивную работу в onCreate или onStartCommand - оба остаются линией пользовательского интерфейса
  • Не выполняйте интенсивную работу в ResultReceiver
  • Не запускайте свои собственные потоки в сервисе - он уже делает это сам
  • Сделайте свою интенсивную работу в onHandleIntent
  • Как спроектировать архитектуру так только данные, которые вы получаете данные, которые изменились
  • Не переходите к другому процессу - поскольку у этого есть накладные расходы процессора и памяти (не подходит для ваших пользователей)

Другим решением является переход на другой тип Сервиса и запуск HandlerThread (или просто запуск самой службы из фонового потока - поскольку служба работает в потоке, который ее запустил)