android — Android: когда я должен использовать Handler () и когда я должен использовать Thread?" />

Android: когда я должен использовать Handler () и когда я должен использовать Thread?

Когда мне нужно что-то для запуска асинхронно , например долго выполняющаяся задача , логика, которая использует сеть, или по какой-либо причине Запуск и запуск нового потока работает нормально. Создание обработчика и его запуск также работают. Какая разница? Когда я должен использовать каждый? Каковы преимущества /причины использовать Handler, а не Thread

PS. - Ради этого вопроса давайте проигнорируем AsyncTask. - Handler().postDelayed сценарий использования мне понятен, ради этого вопроса давайте предположим, что мне нужно, чтобы задача началась немедленно.

126 голосов | спросил JRun 19 WedEurope/Moscow2012-12-19T18:33:45+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 18:33:45 +0400 2012, 18:33:45

7 ответов


0

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

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

Типичное взаимодействие между потоком и обработчиком может выглядеть примерно так:

Handler h = new Handler(){
    @Override
    public void handleMessage(Message msg){
        if(msg.what == 0){
            updateUI();
        }else{
            showErrorDialog();
        }
    }
};

Thread t = new Thread() {
    @Override
    public void run(){
        doSomeWork();
        if(succeed){
            //we can't update the UI from here so we'll signal our handler and it will do it for us.
            h.sendEmptyMessage(0);
        }else{
            h.sendEmptyMessage(1);
        }
    }   
};

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

ответил FoamyGuy 19 WedEurope/Moscow2012-12-19T18:40:47+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 18:40:47 +0400 2012, 18:40:47
0

Обработчик и поток - это действительно две разные вещи.

Поток должен быть создан для выполнения длительных заданий.

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

Таким образом, у вас нет выбора между Handler или Thread. Используйте нить, чтобы делать тяжелую работу! (вы можете использовать обработчик, если ваш фоновый поток будет запускать какую-то работу в другом потоке - большую часть времени поток UI)

ответил ben75 19 WedEurope/Moscow2012-12-19T18:48:20+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 18:48:20 +0400 2012, 18:48:20
0

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

Для получения более подробной информации вы можете проверить эту статью .

enter описание изображения здесь

ответил pierrotlefou 3 AM00000070000003231 2015, 07:02:32
0

A Handler работает на том же Thread, Thread выполняется в другом потоке.

Используйте обработчик, если вам нужно запустить что-то в том же потоке , обычно это элемент GUI или что-то в этом роде.

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

ответил PearsonArtPhoto 19 WedEurope/Moscow2012-12-19T18:40:58+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 18:40:58 +0400 2012, 18:40:58
0

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

Использование:

Тема: выполнять задачи в потоке saperate (Background), чем поток пользовательского интерфейса. (помогает разблокировать поток пользовательского интерфейса)

Обработчик . Используется для связи между пользовательским интерфейсом и фоновым потоком.

Ознакомьтесь с этой статьей

ответил Saubhagya Ranjan Das 17 MarpmTue, 17 Mar 2015 18:30:27 +03002015-03-17T18:30:27+03:0006 2015, 18:30:27
0
  

Если вам нужно обновить пользовательский интерфейс из новой темы, вам нужно   синхронизировать с потоком пользовательского интерфейса.

     

Вы можете использовать класс android.os.Handler или класс AsyncTasks для   этот.

     

Класс Handler может обновлять пользовательский интерфейс. Обработчик обеспечивает   методы для получения экземпляров класса Message или Runnable.

     

Вы можете отправлять сообщения с помощью метода sendMessage (Message msg).   или с помощью метода sendEmptyMessage ().

... подробнее здесь о потоках и т. д. различные механизмы потоков и синхронизации и когда что использовать)

ответил Beachwalker 19 WedEurope/Moscow2012-12-19T18:41:46+04:00Europe/Moscow12bEurope/MoscowWed, 19 Dec 2012 18:41:46 +0400 2012, 18:41:46
0
  

Каковы преимущества /причины использования обработчика, а не потока?

обработчик позволяет отправлять и обрабатывать сообщения и ---- +: = 0 =: + ---- объекты, связанные с Runnable. Каждый экземпляр MessageQueue связан с одним потоком и очередью сообщений этого потока.

Когда вы создаете новый Handler, он привязывается к потоку /очереди сообщений создавшего его потока - из с этого момента он будет доставлять сообщения и исполняемые файлы в эту очередь сообщений и выполнять их по мере их выхода из очереди сообщений.

Существует два основных способа использования обработчика:

  1. Чтобы запланировать выполнение сообщений и Runnables как определенный момент в будущем
  2. Чтобы поставить в очередь действие, которое должно быть выполнено в другом потоке, отличном от вашего собственного.

Если вы используете потоки Java, вам придется что-то обрабатывать самостоятельно - синхронизация с основным потоком, отмена потока и т. д.

Этот отдельный поток не создает пул потоков, если вы не используете Handler или ThreadPoolExecutor API.

(этот запрос взят из ваших комментариев к ответу Blackbelt)

  

Почему бы не использовать исполнителя? и даже если я хочу использовать для этого обработчик, как?

Ссылка: статья по производительности потоков

Существуют определенные типы работ, которые можно свести к высокопараллельным распределенным задачам. С огромным объемом рабочих пакетов, которые это создает, ExecutorService и AsyncTask не являются подходящими классами. Однопоточная природа HandlerThread превратит всю работу с потоками в линейную систему. С другой стороны, использование класса AsyncTask потребует от программиста ручного управления балансировкой нагрузки между группами потоков.

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

HandlerThread

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

Просмотрите этот пост, чтобы узнать, как использовать BlockingQueue workQueue= new LinkedBlockingQueue<Runnable>(100); // Work pool size ThreadPoolExecutor executor = new ThreadPoolExecutor( Runtime.getRuntime().availableProcessors(), // Initial pool size Runtime.getRuntime().availableProcessors(), // Max pool size 1, // KEEP_ALIVE_TIME TimeUnit.SECONDS, // KEEP_ALIVE_TIME_UNIT workQueue); для запуска нескольких экземпляров Runnable. В этом случае все задачи Handler будут выполняться в одном потоке.

Android: тост в потоке

ответил Ravindra babu 28 PM00000040000004631 2017, 16:07:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132