Android, Threads - обработчики / asynctask - PullRequest
2 голосов
/ 24 июля 2011

Я новичок в изучении Android через книгу, и я вижу, что в книге есть три основных способа:

  • Обработчики с помощью сообщений
  • Обработчики по почте
  • Asynctask

Все 3 кажутся хорошими, мой вопрос:
Есть ли конкретное время, когда вы используете один из вышеперечисленных?Или это личное предпочтение?

РЕДАКТИРОВАТЬ:
Если это не личное предпочтение, пожалуйста, дайте мне пример того, когда вы будете использовать одно, если не другое (даже ссылка будет приветствоваться)

Поскольку я планирую запустить несколько потоков (например, один для общего времени выполнения приложения, один для времени до выбора ответа и т. Д. В приложении, один для перемещения фонового изображения и т. Д.) И хочу знать, какой из них выбрать.Я могу сделать функциональность того, что я хочу, используя любой из этих трех методов, поэтому я не понимаю, почему есть три, когда это можно сделать любым из них.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 24 июля 2011

Обработчик - это очень простой способ, который позволяет вам выполнять некоторый код в другом потоке, обычно в потоке пользовательского интерфейса. Он не говорит вам, как запустить ваши темы, и вы можете делать все, что вы хотите в этом отношении. Я бы выбрал handleMessage подход, если у вас есть явный обмен сообщениями. То есть вам нужно, чтобы некоторые данные были отправлены и получены. Если вам просто нужно что-то сделать, вы можете использовать Runnable. Однако оба метода пригодны для использования, и выбор часто будет результатом предпочтения.

AsyncTask - это концепция более высокого уровня, которая использует обработчики под капотом. Если вы используете его, вам не придется иметь дело с потоками самостоятельно. Ваш асинхронный код будет выполняться через пул потоков и контролироваться платформой. У вас будет два метода, которые позволят вам выполнить код в потоке пользовательского интерфейса (onPostExecute и onProgressUpdate).

В двух словах, выберите AsyncTask для большинства вещей, которые вы делаете с несколькими потоками, это избавит вас от необходимости заниматься управлением потоками самостоятельно. Если вам нужны только собственные потоки, используйте обработчики. Обратите внимание, что есть и другие случаи, когда вам нужно использовать обработчики. Например, с Messenger. Также у меня были случаи, когда использования onProgressUpdate недостаточно. В этом случае я бы также использовал обработчик из doInBackground.

1 голос
/ 24 июля 2011

Обработчик: привязан к потоку, который его создал. Задачи очереди / постановки в очередь сообщений. Когда он помещает сообщение в очередь, он передает его в другой поток, чем тот, который его создал. Думайте об этом как об агенте. Он обрабатывает запросы, отправленные ему, и соответственно их делегирует.

Post / Messaging: Как объяснялось выше, это просто обработчик отправки (постановки в очередь) или обмена сообщениями (постановки в очередь).

Asynctask: Поток, предназначенный в основном для небольших задач, которые необходимо выполнять в фоновом режиме и обновлять пользовательский интерфейс в зависимости от их прогресса (панель загрузки или загрузка; пользовательский интерфейс обновляется с этим прогрессом).

1 голос
/ 24 июля 2011

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

0 голосов
/ 19 августа 2014

Проверьте Иглу, и вы можете забыть Обработчики и Asynctasks.Needle - это простая, но мощная многопоточная библиотека с открытым исходным кодом для 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

...