2017-02-01 3 views
4

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

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

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

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

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

+0

Если вы хотите, чтобы AsyncTask была привязана к жизненному циклу Activity/Fragment, вы можете подклассифицировать AsyncTaskLoader. Кстати, BTW работает с 10 потоками для очень многих устройств, специально для старых, что означает, что вам нужно иметь алгоритм, который масштабируется на основе емкости устройства. – Enzokie

+0

Да, не обязательно 10 за раз для всех устройств, но это может быть просто возможность запускать некоторые из них параллельно, не потребляя тяжелых ресурсов. – user963241

ответ

5

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

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

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

  • Handler
  • Runnable

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

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

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

PS: [Citation]: The busy coder's guide to Android development v5.8 по @Commonsware, который выпущен под Creative Commons Attribution Non-Commercial Share Alike 4.0 License

+0

Зависит, для сетей уже существуют некоторые очень мощные библиотеки, см. Это: https://github.com/shaheenkdr/awesome-android#networking – OBX

+0

Также для REST apis, Модернизация также. Все они могут быть настроены в широких пределах. Как настройка времени ожидания, пропускная способность, качество соединения, кеширование, предварительная выборка и надлежащее отмена запроса и т. Д. – OBX

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

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

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

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

+1

Согласен с тем, что утечка памяти вызвана плохими реализациями, а не самой нитью. – Enzokie

+0

Обратите внимание, что службы ** ** не являются альтернативой AsyncTask, потому что они ** не ** автоматически порождают отдельный поток. –

+0

Да. Это правда. – mallaudin

0

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

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

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

, который может быть долго работает (как потоковый)

Если вы потоковое вещание через некоторое аудио или видео, то лучше всего использовать услугу либо нормальный Service или Intent Service в зависимости от вашего требования.

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

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

Смежные вопросы