Выполнение фоновых задач – альтернатива AsyncTask?

Я хочу иметь различные асинхронные потоки в приложении, например, вокруг 5-10 потоков для фоновых задач, которые могут быть длинными (например, потоковая передача), и я также обновляю пользовательский интерфейс, чтобы при необходимости публиковать некоторые результаты.

Из того, что я слышал о том, что AsyncTask имеет проблемы с:

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

Итак, я ищу альтернативу (возможно, без использования каких-либо сторонних библиотек), которая не имеет этих проблем.

Должен ли я лучше использовать простые потоки Java? Я не против использовать их, учитывая, что они не будут давать никаких проблем с AsynTask.

В большинстве сценариев AsyncTask должно быть достаточно. Однако есть сценарии, в которых нельзя использовать AsyncTask . Т.е. AsyncTask управляет пулом потоков, из которого он вытягивает потоки, которые будут использоваться экземплярами задач. Теперь пулы потоков предполагают, что они вернут свои потоки после разумного периода времени. Поэтому в сценарии, когда вы не знаете, сколько времени вам понадобится, вы не сможете использовать AsyncTask . А с Android 4.4 размер пула потоков может вырасти только до: (no of CPU cores * 2) + 1 . Таким образом, на двухъядерном процессоре максимальное количество потоков, которые вы можете создать, ограничено 5.

Итак, я ищу альтернативу (возможно, без использования каких-либо сторонних библиотек), которая не имеет этих проблем.

AsyncTask к альтернативам AsyncTask , это доступные варианты:

  • укротитель
  • Runnable

Теперь есть минусы для всех фоновых потоков независимо от того, насколько красиво они иллюстрированы, среди них есть:

  • Возможность взаимодействия пользователя во время обработки фонового потока. Если работа, выполняемая фоновым потоком, изменяется, вам нужно будет передать ее обратно в фоновый поток. java.util.concurrent есть много классов, которые помогут в этих сценариях
  • Возможность самого процесса убивается, пока поток выполняет задачи. Поэтому в этих случаях вместо использования AsyncTask или более простого Thread Service или IntentService будет идеальным вариантом.
  • Возможность ошибки, возникающей в фоновом потоке, например, извлечения данных с сервера во время соединения, теряется, вам нужно вручную закрыть фоновый поток.

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

PS: [Цитирование]: Руководство для занятого кодера по разработке Android v5.8 от @Commonsware, которое выпущено под лицензией Creative Commons Attribution Non-Commercial Share Alike 4.0

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

Простые потоки java не решат ни одну из этих проблем. Специально, утечка памяти.

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

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

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

  1. Обработчики
  2. Runnables

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

Который может быть длительным (например, потоковая передача)

Если вы перекачиваете какой-либо звук или видео, лучше использовать службу либо обычную Service либо Intent Service зависимости от ваших требований.

Вы можете уничтожить службу, когда это необходимо, или позволить системе Android делать это, когда это необходимо.

Поэтому я предлагаю вам использовать Службу в таком сценарии.