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

Android: AsyncTask ИЛИ обычные потоки Java с ExecutorService

В моем приложении используется Service, чтобы сделать некоторые фоновые вещи. Я использую дополнительные потоки в службе для выполнения некоторых вычислений. Для этого я создаю два потока каждые 5-10 секунд, которые работают от 5 до 10 секунд. Но я не знаю, какую нить-моделью я должен использовать:

  • AsyncTask:

    Плюсы:

    • простой в использовании
    • специфический для Android
    • простое пользовательское взаимодействие

    Минусы:

    • Так как я должен использовать уровень API 10, не существует ExecutorService с фиксированным пулом потоков для выполнения AsyncTasks
  • Нормальные потоки Java:

    Плюсы:

    • ExecutorService с фиксированным пулом потоков

    Минусы:

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

Какую модель лучше использовать? Особенно это касается производительности. Есть ли тяжелые накладные расходы, когда я использую AsyncTasks и быстрее ли используется ExecutorService при повторном использовании потоков, чем Android, при создании новых AsyncTasks?

4b9b3361

Ответ 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