Планировщик заданий и работоспособность: недостатки? - PullRequest
0 голосов
/ 07 июня 2018

Я вижу, что для периодических фоновых задач часто используется JobScheduler.Кроме того, есть также JobService и AlarmManager для немного (?) Различных вариантов использования.Но почему бы просто не раскрутить новый Runnable?Каковы недостатки использования Runnable для фоновых задач?Runnable использует ли больше ресурсов в режиме ожидания?

1 Ответ

0 голосов
/ 07 июня 2018

Runnable - это интерфейс, который ничего не делает сам по себе, кроме как предоставляет единственный метод с именем run.Возможно, вы задаетесь вопросом о том, как HandlerThread, Thread, AsyncTask, ExecutorService используются против JobScheduler, IntentService и AlarmManager?

Вот потоки Androidшпаргалка:

  • Runnable: интерфейс, который ничего не делает сам по себе, но используется при взаимодействии со многими другими связанными с потоками классами
  • Thread: наиболее элементарный способдля запуска кода из основного потока процесса.
  • AsyncTask: базовый Android-ориентированный способ запуска кода из основного потока, есть один поток, посвященный всем экземплярам AsyncTask, поэтому только один из них может быть запущенза один раз в процессе
  • HandlerThread: удобный способ отправки сообщений (возможно, с задержкой) между вашим основным потоком и другим потоком
  • ExecutorService: мощный пул потоков, который позволяет вамиспользовать преимущества нескольких процессорных ядер
  • Service (Android): компонент Android, не имеющий пользовательского интерфейса, но методы которого по-прежнему работают в основном потоке
  • IntentService: anAndroid-подкласс службы вы можете продлитькоторый содержит один фоновый поток, в котором может выполняться работа без связанной активности
  • AlarmManager: механизм, предоставляемый системой Android для запуска компонентов Android в определенное время, но который забывает все при перезагрузке
  • JobScheduler: механизм Lollipop и выше, предоставляемый системой Android для запуска Android-сервисов на основе описания работы, которая должна быть выполнена, и которая может дополнительно сохранять конфигурацию при перезагрузке (предпочтительнее WorkManager сейчас)
  • WorkManager: компонент архитектуры Android (библиотека, предоставляемая Google, которая работает на многих версиях Android), которая работает аналогично JobScheduler, но дополнительно позволяет координировать несколько заданий

Как ОС Android управляетпроцессы и потоки:

Важно понимать, как ОС Android управляет приложениями при выборе механизма потоков.ОС Android видит приложения и компоненты внутри приложений (Activity, Service, BroadcastReciever и ContentProvider).Операционная система Android высокого уровня не знает о потоках внутри приложения.

В отличие от приложений на настольном компьютере, процессы установленных приложений в ОС Android имеют гораздо более размытый жизненный цикл.Например, если вы запускаете приложение калькулятора, Android создает для него процесс linux.Если вы выходите из калькулятора, он, как правило, не сразу убивает процесс калькулятора.Если вы начинаете использовать много других приложений и не возвращаетесь в калькулятор в течение длительного времени, он может в конечном итоге решить восстановить память, используемую процессом калькулятора, и завершить этот процесс.Даже если процесс живет, пользователь может позволить телефону перейти в спящий режим, и ЦП прекратит выполнение всех потоков во всех процессах, пока ЦП не проснется снова.Wakelocks может предотвратить спящий процессор.Такие механизмы, как WorkManager, могут позаботиться о вас.

На практике это означает, что вы можете отделять нити от Activity их собственной жизни, которая может продолжаться до тех пор, покапоскольку процесс активен, потоки не приостанавливаются и не останавливаются ОС Android, даже если Activity может получать эти обратные вызовы жизненного цикла.Однако, когда Android решает завершить ваш процесс, все ваши потоки тоже умирают.Единственный способ для вас, как разработчика приложения, сообщить Android, что он не должен убивать ваш процесс, - это создать Service и, возможно, даже сделать его приоритетным Service, чтобы Android знал, что в вашем приложении происходит что-то важное, илииспользуйте WorkManager, поскольку Android знает об этом (под капотом это, вероятно, Service ...).При использовании Service вам все еще нужно выделить какой-то поток, чтобы выполнять свою работу, потому что функция Service выполняется в главном потоке вашего процесса, если только вы не получаете сообщения через вызовы связывания IPC, те, которые выполняются напул из 16 связующих потоков, то же самое относится и к ContentProvider методам, если они вызываются через IPC, а не локально.

Вот несколько вопросов, которые помогут вам решить, что использовать:

  • Выполняете ли вы задачу, которая напрямую связана с деятельностью, с которой пользователь визуально взаимодействует на экранепрямо сейчас?

Рассмотрим HandlerThread, AsyncTask или ExecutorService

  • Вы играете музыку в фоновом режиме или что-то еще, что пользователь хочет контролировать с помощьюуведомление?

Рассмотрим Service в сочетании с HandlerThread или чем-то подобным.

  • Выполняете ли вы задачу, которая должна произойти рано или поздно, но это не такпрямо связано с тем, что происходит на экране прямо сейчас?

Рассмотрим WorkManager или AlarmManager с IntentService

  • Если пользователь выключает свое устройство прямокогда ваша задача вот-вот начнется, хотите ли вы попробовать еще раз, когда устройство снова включится?

Рассмотрим WorkManager

Как всегда, лучше всего получить такой видинформация прямо из источника.Например, https://developer.android.com/topic/libraries/architecture/workmanager Google говорит:

Примечание. WorkManager предназначен для задач, требующих гарантии того, что система их запустит, даже если приложение выйдет, например, для загрузки данных приложения на сервер.,Он не предназначен для фоновой работы в процессе, которую можно безопасно прекратить, если процесс приложения завершится;для подобных ситуаций мы рекомендуем использовать ThreadPools.

Для получения дополнительных советов, подобных этому, прочитайте javadocs и руководства по https://developer.android.com/

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