Подтвердить что ты не робот

Asynctask vs Thread vs Services vs Loader

Я немного запутался в различиях между Asynctask, Thread, Service, Loader в Android.

Я знаю, как это работает. Но я все еще не понимаю, что и когда я должен использовать.

Я работаю с Android в течение 3 лет и обычно использую Asynctask для всех фоновых задач (а иногда и для Thread). Но многие люди говорят, что "Asynctask устарела" и не рекомендуют их использовать. Также они рекомендуют использовать robospice или Volley.

Итак, действительно ли это Asynctask, и я должен использовать фреймворк для сетевых задач? И что я должен использовать для фоновой (не сетевой) задачи?

4b9b3361

Ответ 1

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

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

Как правило, несколько преимуществ Volley заключаются в следующем.

  • Он информирует рабочий поток о деятельности (Основной поток)
  • Упрощение приоритетов ресурсов вы можете обеспечить приоритет для запросов на загрузку. Типичный сценарий предполагает, что вы отдаете приоритет над текстом поверх изображения.
  • Эффективный кэш запросов и управление памятью.
  • Extensible
  • Он предоставляет вам возможность отменить ваш запрос в случае, если ваша активность была отключена или перезапущена.
  • Упрощенные шаблоны для поиска данных, в отличие от AsyncTasks.

Волейбол плохо работает, когда речь заходит о потоковых запросах/видео, как указано в Google I/O.

Я точно не знаю о робосписе. Ps: Если у вас есть время на руке, см. https://www.youtube.com/watch?v=yhv8l9F44qo

Далее читайте, хотите ли вы пойти в другие библиотеки с ориентирами для этого же. Сравнение сетевых библиотек Android: OkHTTP, Retrofit и Volley

Ответ 2

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

AsyncTask: отличная библиотека потоков, доступная в Android для выполнения фоновой задачи. Он управляется самой ОС Android, вы можете обновить интерфейс пользователя. Он работает параллельно или последовательно в зависимости от версии Android. Иногда бывает бесполезно использовать его, как в случае изменений ориентации, и теперь для создания сетевых вызовов вы можете использовать залп, который лучше, чем AsyncTask. AsyncTasks не беспокоится о том, что их родительская активность запущена или нет, и иногда может быть довольно утомительно ее отменить. Итак, я бы предложил вам, если вы используете AsyncTask, чтобы лучше использовать API-интерфейсы для отдыха, RETROFIT или VOLLEY, и если вы выберете RETROFIT между ними, я бы порекомендовал вам взглянуть на PICASSO еще одна удивительная библиотека из квадрата для загрузки изображения.

Сервис. Для выполнения долгосрочных фоновых задач вы должны использовать службы. Вы можете связать службы с вашей деятельностью, если вам нужно. Вы можете определить, что они запускаются в том же потоке или другом потоке, и вам нужно объявить его в манифесте, или вы можете использовать IntentService - вариант службы, который работает в своем потоке, но будьте осторожны, прежде чем использовать его, не используйте его для выполнения длительных задач. Это одноразовый оператор. Если вы собираетесь использовать услугу, оцените, что тот, который соответствует вашему требованию, лучше обычного Службы или IntentService

Погрузчики: это то же самое, что и AsyncTask во многих отношениях, рекомендуется использовать загрузчики с фрагментами и решает проблему ориентации асинтак. надеюсь, что это помогло.

Ответ 3

Но многие люди говорят, что "Asynctask устарела" и не рекомендуют их использовать.

Я не сталкивался с тем, кто сказал это. Но задача команды Android состоит в том, чтобы решить, устарела или устарела какая-то часть фреймворка. CursorLoaders используйте AsyncTaskLoader, который использует AsyncTask. AsyncTasks - это абстракция, которая препятствует разработчику реализовать неприятную логику состояния Thread. Это означает, что все эти классы в свою очередь используют Threads на фоне.

Итак, Asynctask действительно так плохо, и я должен использовать фреймворк для сетевые задачи? И что я должен использовать для фона (не сетевой)?

Это все о знании, когда и как использовать ваши инструменты. Вы упомянули CursorLoader. В этом конкретном случае, когда вы читаете документы и играете с ним немного, вы понимаете, что он намеренно плавно интегрируется с ContentProviders. Теперь ContentProviders абстрагируйте базовые данные; вы можете запрашивать локальную базу данных SQLite или удаленный сервер.

Как правило, AsyncTasks используются для получения кратких фрагментов "слишком большой" информации (при разговоре с серверами). Люди могут сказать, что AsyncTasks устарели, потому что есть лучшие (более эффективные) способы взаимодействия с серверами (см. Retrofit).

Ответ 4

Неважно, какая абстракция вы используете, она сводится к Thread. Поэтому каждый из асинхронных/параллельных классов Android использует Thread/Executor за кулисами и имеет точно такие же потенциальные проблемы, как блокировка, которые имеют потоки.

Разница между тем заключается в ее использовании. AsyncTask, например, определяет удобный обратный вызов завершения - onPostExecute(). A CountDownTimer позволяет вам контролировать время и т.д.

Конечно, вы можете использовать простой Thread, но в этом случае вам нужно больше времени уделять поиску возможных проблем.

Итак, Android предоставляет вам несколько правильных инструментов для правильных заданий.

Ответ 5

Я думаю, что AsyncTask лучше, чем Thread, поскольку он обеспечивает обратный вызов в основном потоке. Loader лучше, чем AsyncTask, поскольку он также обрабатывает изменения конфигурации для вас.

Ответ 6

AsyncTask:

AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

AsyncTask предназначен для вспомогательного класса вокруг Thread and Handler и не представляет собой общую структуру потоков. AsyncTasks в идеале следует использовать для коротких операций ( несколько секунд максимум.)

Если вам нужно поддерживать потоки в течение длительного периода времени, настоятельно рекомендуется использовать различные API-интерфейсы, предоставляемые пакетом java.util.concurrent, такие как Executor, ThreadPoolExecutor и FutureTask.

Thread:

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

Используйте его для разделения длительных вычислений из основного потока (поток пользовательского интерфейса)

Service:

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

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

IntentService:

IntentService - это базовый класс для служб, которые обрабатывают асинхронные запросы (выраженные как намерения) по требованию.

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

Loader:

API-интерфейс Loader позволяет загружать данные из поставщика контента или другого источника данных для отображения в Activity или Fragment.

Погрузчики решают эти проблемы и включают другие преимущества. Например:

  • Погрузчики работают на отдельных потоках, чтобы предотвратить зависание или невосприимчивость к пользовательскому интерфейсу.

  • Погрузчики упрощают управление потоками, предоставляя методы обратного вызова при возникновении событий.

  • Погрузчики сохраняют и кэшируют результаты изменений конфигурации для предотвращения дублирования запросов.
  • Погрузчики могут реализовать наблюдателя для мониторинга изменений в базовом источнике данных.

Итак, Asynctask действительно так плохо, и я должен использовать фреймворк для сетевых задач? И что я должен использовать для фоновой (не сетевой) задачи?

Используйте AsyncTask для обработки рабочих элементов короче 5 мс. Вы можете использовать либо Thread Or Service, либо IntentService для фоновой задачи.