Android: AsyncTask ИЛИ обычные потоки Java с ExecutorService
В моем приложении используется Service
, чтобы сделать некоторые фоновые вещи. Я использую дополнительные потоки в службе для выполнения некоторых вычислений. Для этого я создаю два потока каждые 5-10 секунд, которые работают от 5 до 10 секунд. Но я не знаю, какую нить-моделью я должен использовать:
-
AsyncTask:
Плюсы:
- простой в использовании
- специфический для Android
- простое пользовательское взаимодействие
Минусы:
- Так как я должен использовать уровень API 10, не существует
ExecutorService
с фиксированным пулом потоков для выполнения AsyncTasks
-
Нормальные потоки Java:
Плюсы:
- ExecutorService с фиксированным пулом потоков
Минусы:
- Не так легко обрабатывать, например. Пользовательский интерфейс взаимодействия
Какую модель лучше использовать? Особенно это касается производительности. Есть ли тяжелые накладные расходы, когда я использую AsyncTasks и быстрее ли используется ExecutorService при повторном использовании потоков, чем Android, при создании новых AsyncTasks?
Ответы
Ответ 1
Если вы посмотрите на реализацию AsyncTask
, вы увидите, что он использует свой собственный пул потоков, используя "обычные потоки Java".
Есть ли тяжелые накладные расходы, когда я использую AsyncTasks, и является ли ExecutorService быстрее при повторном использовании потоков, чем Android, при создании новых AsyncTasks?
Между ними не должно быть существенной разницы.
Ответ 2
Я использую иглу; открытая, простая и мощная многопоточная библиотека для Android. С его помощью вы можете сказать такие вещи, как:
Needle.onMainThread().execute(new Runnable() {
@Override
public void run() {
// e.g. change one of the views
}
});
или
Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() {
@Override
protected Integer doWork() {
int result = 1+2;
return result;
}
@Override
protected void thenDoUiRelatedWork(Integer result) {
mSomeTextView.setText("result: " + result);
}
});
Доводы
- очень простой API
- фиксированный размер пула потоков
- настраиваемый размер пула потоков
- поддерживает взаимодействие с пользовательским интерфейсом ( "работайте, а затем используйте результат в потоке пользовательского интерфейса" )
- android 1.5 +
- ведет себя одинаково на всех версиях платформы
против
- зависимость от дополнительной библиотеки
Проверьте это на GitHub: https://github.com/ZsoltSafrany/needle