Asynctask vs Thread в android


135

В інтерфейсі для виконання деяких фонових робіт я використовував окрему Thread. Але як пропонують інші, я зараз використовую AsyncTask.

У чому головна відмінність між a Threadі an AsyncTask?

У якому сценарії я повинен використовувати a Threadчи an AsyncTask?



@ webaldo.at Я це виклав, тут вони ввели опис та різницю між Asynctask і Thread.Я хочу знати, у якому випадку, наприклад, підключення до мережі, читання файлу для чого я використовую ?.
Рам

Скорочене: Нитка -> Немає доступу до UI-Thread || Asynctask -> Умовний доступ до інтерфейсу користувача
JavaDM

для фонового завдання IntentService - ще один приємний варіант.
Чень

Відповіді:


146

Для виконання довготривалих або процесорних завдань, в основному, це два способи: потоки Java і рідний AsyncTask Android.

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

Використовуйте AsyncTask для:

  1. Прості мережеві операції, які не потребують завантаження великої кількості даних
  2. Завдання, пов’язані з диском, можуть зайняти більше декількох мілісекунд

Використовуйте потоки Java для:

  1. Мережеві операції, які передбачають помірну та велику кількість даних (завантаження чи завантаження)
  2. Завдання з високим процесором, які потрібно виконувати у фоновому режимі
  3. Будь-яке завдання, де ви хочете контролювати використання процесора відносно потоку GUI

І є багато хороших ресурсів через Інтернет, які можуть вам допомогти:

http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html


Чи можу я запитати, чому проблема даних про завантаження є проблемою?
Yeung

1
@Yeung Здається, вам потрібно зрозуміти завдання Async! Подивіться, більший обсяг даних, тоді явно більший час, необхідний для виконання тієї ж операції. Тому не дуже корисно виконувати тривалий процес, використовуючи завдання Async з наступних причин: 1. Завдання Async погано пов'язане з життєвим циклом діяльності. 2. Вони створюють меоморійні витоки.
Мохіт

3
Подивіться на це: stackoverflow.com/questions/12797550/…
Mohit

Дякую. Я зараз розумію ризик.
Yeung

@Impasse @Yeung Обсяг даних IMO - це не проблема, ключова проблема в мережевих операціях - це час операції. Навіть завантаження декількох байтів може зайняти тривалий час, коли сервер зайнятий, недоступний (таймаут) тощо. Виправленням може бути використання AsyncTaskвласного планувальника.
xmedeko

44

Якщо ви використовуєте потоки Java, вам належить обробляти наступні вимоги у власному коді:

Синхронізація з основною темою, якщо ви опублікуєте результати в інтерфейсі користувача

Немає за замовчуванням для скасування потоку

Немає об'єднання ниток за замовчуванням

Немає за замовчуванням для обробки змін конфігурації в Android


3
це насправді є більш зрозумілим, оскільки він вирішує причини, чому не використовувати прості теми. Зверху на думку, все, що потрібно прив’язати до життєвого циклу активності / сервісу, має використовувати AsyncTask замість цього, хоча вам потрібно вручну "витончено деградувати" ресурси всередині завдання, принаймні, ви не закінчите з тим, що завдання висить коли активність вбивається.
leRobot

28

Нитка

  • Довге завдання загалом
  • Викликати метод thread.start ()
  • Запускається з будь-якої нитки
  • Працює на власній нитці
  • Ручне управління потоком / кодом може стати важким для читання

AsyncTask

  • Невелике завдання , пов’язане з основним потоком
  • Викликати метод excute ()
  • Запускається від основної нитки
  • Працює на робочій нитці
  • Потрібно виконати і створити з основної нитки

11

Нитка

Нитка - це паралельна одиниця виконання. У нього є власний стек викликів. Існує два способи реалізації потоків у додатках.

Один - надання нового класу, який розширює Thread і переосмислює його метод run (). Інший - надання нового екземпляра Thread об'єктом Runnable під час його створення. Нитку можна виконати, викликавши її метод "start". Ви можете встановити "Пріоритет" потоку, викликавши його метод "setPriority (int)".

Нитка може бути використана, якщо ви не впливаєте на частину інтерфейсу користувача. Наприклад, ви телефонуєте в якусь веб-службу або завантажуєте деякі дані, а після завантаження відображаєте їх на екрані. Тоді вам потрібно скористатися обробником з ниткою, і це ускладнить вашу програму для обробки всіх відповідей з теми.

Обробник дозволяє вам надсилати та обробляти об'єкти повідомлень та запуску, пов'язані з чергою повідомлень потоку. Кожен потік має кожну чергу повідомлень. (Як і список справ), і потік буде приймати кожне повідомлення та обробляти його, поки черга повідомлень не буде порожньою. Отже, коли обробник спілкується, він просто передає повідомлення потоку абонента, і він буде чекати, щоб обробити.

Якщо ви використовуєте потоки Java, вам потрібно обробляти наступні вимоги у власному коді:

Синхронізація з основним потоком, якщо ви опублікуєте результати в інтерфейсі користувача. Немає за замовчуванням для скасування потоку. Немає об'єднання ниток за замовчуванням. Немає за замовчуванням для обробки змін конфігурації в Android

AsyncTask

AsyncTask забезпечує правильне та просте використання потоку інтерфейсу користувача. Цей клас дозволяє виконувати фонові операції та публікувати результати в потоці інтерфейсу користувача, не маніпулюючи потоками та / або обробниками. Асинхронна задача визначається обчисленням, яке працює на фоновому потоці і результат якого публікується на потоці інтерфейсу користувача.

AsyncTask пройде наступні 4 етапи:

onPreExecute ()

Викликається на потік інтерфейсу користувача перед виконанням завдання

doInbackground (Параметри ..)

Викликається у фоновий потік відразу після завершення виконання onPreExecute ().

onProgressUpdate (Прогрес ..)

Викликається на потік інтерфейсу користувача після дзвінка на публікаціюПрогрес (Прогрес ...).

onPostExecute (Результат)

Після завершення обчислення фону викликається на потік інтерфейсу користувача.

Чому слід використовувати AsyncTask?

Проста у використанні для потоку інтерфейсу користувача. (Отже, використовуйте його, коли потік виклику є потоком інтерфейсу користувача).

Не потрібно маніпулювати обробниками.

Для отримання додаткової інформації відвідайте тут


2

Нитка:

Threadслід використовувати для відокремлення тривалих операцій від основної нитки, щоб покращити продуктивність. Але це не може бути скасовано елегантно, і він не може впоратися зі змінами конфігурації Android. Ви не можете оновити інтерфейс користувача з Thread.

AsyncTaskможе використовуватися для обробки робочих предметів тривалістю менше 5 мс. З AsyncTask, ви можете оновити інтерфейс користувача на відміну від Java Thread. Але багато тривалих завдань будуть задушені.

У вас є ще кілька альтернатив для обох.

HandlerThread / Handler та ThreadPoolExecutor

Детальнішу інформацію див. У нижченаведеному пості:

Handler vs AsyncTask vs Thread

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.