Intereting Posts
Процентная ширина в RelativeLayout Ошибка размещения макета Android: «Идентификатор ресурса <res_id> не относится к типу STYLE (вместо attr)" Android: Как сделать приятную анимацию сердечного ритма? Обновление списка просмотра Android Android: SkImageDecoder :: Factory возвращен null Как создать полностью настраиваемый диалог / всплывающее окно в Android (изменить цвет наложения и расположение диалогового окна) Как получить ключ для выпуска Google Maps API v2 Не удалось выполнить синхронизацию по градлу: невозможно найти метод Как получить номер IMEI в PhoneGap? Android Login – Лучшая реализация Реализация функций USSD. Связывание службы с PhoneUtils без перезапуска телефона при каждом обновлении Предотвращение нежелательной обертки строк в TextView Почему excludeFromRecents удаляет все действия? API Google Android для Android v2 выбрасывает GooglePlayServicesNotAvailableException, устаревший, SupportMapFragment.getMap () возвращает null Разрешение экрана для Android android x86

В чем разница между обработчиком, Runnable и Threads?

В чем разница между обработчиком, Runnable и Threads?

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

Я также видел несколько примеров, которые внедряют runnable и переходят в runnable в Threads.

Однако я все еще смущен. Может ли кто-нибудь дать мне четкое объяснение?

  1. Какой смысл Runnable, если можно записать код фона в методе запуска Thread?
  2. Как Handler используется внутри потока и почему мы должны его использовать.
  3. Android имеет другую вещь, вызывающую runOnUiThread, как мы это используем? Я знаю, что он используется для обновления пользовательского интерфейса.

Solutions Collecting From Web of "В чем разница между обработчиком, Runnable и Threads?"

Зачем использовать Runnable over Thread?

  • Runnable отделяет код, который должен выполняться асинхронно, от того , как выполняется код. Это обеспечивает гибкость вашего кода. Например, асинхронный код в runnable может выполняться на threadpool или выделенный поток.

    В потоке указано, что ваш runnable, вероятно, не нуждается в доступе. Наличие доступа к большему количеству состояний, чем необходимо, плохой дизайн.

    Темы занимают много памяти. Создание нового потока для каждого небольшого действия требует времени обработки для выделения и освобождения этой памяти.

Что такое runOnUiThread?

  • Android runOnUiThread для Android запускает Runnable для выполнения в потоке пользовательского интерфейса. Это важно, потому что вы никогда не должны обновлять пользовательский интерфейс из нескольких потоков. runOnUiThread использует Handler .

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

Что такое обработчик?

  • Обработчик позволяет вам отправлять runnables для выполнения в определенном потоке. За кулисами runOnUi Thread запускает ваш Runnable с помощью Ui Handler от Android, поэтому ваш runnable может безопасно выполнять работу в потоке пользовательского интерфейса.

1. Почему возможен?

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

Кроме того, когда вы расширяете класс Thread, каждый из ваших потоков создает уникальный объект и связывается с ним. Когда вы реализуете Runnable, он разделяет один и тот же объект на несколько потоков.

2. Зачем использовать обработчик и что это такое?

Обработчик написан на Java (внутренне использует Thread), поэтому все, что вы можете сделать с Handler, вы также можете использовать с помощью Thread.

Так почему вы должны использовать Handler? Причина следующая:

  • Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с MessageQueue потока. Проще говоря, обработчик упрощает вашу работу.

  • Android имеет два основных правила для обработки потоков:

  • Не блокируйте поток пользовательского интерфейса

  • Не обращайтесь к инструментарию Android UI из-за пределов пользовательского интерфейса

Чтобы связать по 2 правилам, указанным выше, в android у нас есть 3 встроенных метода, которые могут обрабатывать ситуацию, когда один из ваших классов активности запускается или вызывается из другого потока.

Затем мы можем запланировать обновление пользовательских интерфейсов в потоке пользовательского интерфейса с помощью этих трех методов ниже. Затем Activity или View работают в качестве обработчика (подробнее о обработчиках ниже) и планируют вашу работу с потоком пользовательского интерфейса:

  1. Activity.runOnUiThread (Runnable)
    1. View.post (Runnable)
    2. View.postDelayed (Runnable, long) // (long = время для планирования)

3. Что такое UI Thread?

Нить UI – это основной поток, в котором отображаются элементы пользовательского интерфейса, такие как View и Activity. Любые трудоемкие операции не должны возникать в потоке пользовательского интерфейса. По умолчанию приложение работает в потоке пользовательского интерфейса. Вам не нужно ничего особенного использовать в потоке пользовательского интерфейса.

Handler, Runnable и Threads работают вместе, я не думаю, что вы должны их сравнить.

укротитель

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

Runnable

Это интерфейс, который вы реализуете, в реализации вы ставите логику, которую вы хотите выполнить на каком-то потоке. Вы действительно можете использовать Runnable также в местах, не связанных с потоком. Многие Java apis фактически используют Runnable, а не только Thread's. Вы можете отправлять Runnable с помощью обработчика, или вы можете использовать его с исполнителями. Runnables хороши, потому что вы можете реализовать их в форме анонимной реализации.

UniThread

Вы имели в виду UI Thread? Большинство пользовательских интерфейсов реализуют свои работы в одном потоке, все элементы пользовательского интерфейса: окна / виджеты обмениваются сообщениями (как в Handler). То есть. Пользователь нажимает кнопку, это инициирует сообщение с информацией о том, что кнопка была нажата, она отправляется в поток пользовательского интерфейса и, наконец, доставляется вашему слушателю.

В Android запрещается (приводит к исключению) изменять элементы пользовательского интерфейса из потока, отличного от UI, это имеет смысл – если вы измените его из другого потока, это может произойти, когда поток пользовательского интерфейса выполняет некоторые изменения в том же виджете, что приводит к неопределенному поведению ,

Какой смысл Runnable, если можно записать код фона в методе запуска Thread?

Runnable – это интерфейс, который используется для создания нового класса потоков, аналогичного классу потоков, созданного расширением класса java.lang.Thread . Единственное отличие заключается в том, что интерфейс Runnable позволяет классу расширять другой класс (если требуется) для переопределения / наследования функций некоторого класса. Расширение класса java.lang.Thread отменяет эту возможность.

Кроме того, интерфейс Runnable представляет собой задачу, которая может выполняться либо простым потоком, либо исполнителями, либо любыми другими способами. Поэтому логическое разделение Задачи как Runnable than Thread – хорошее дизайнерское решение.

Подробнее: http://javarevisited.blogspot.com/2012/01/difference-thread-vs-runnable-interface.html#ixzz2qgjDYJhT