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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Что делает runOnUiThread на самом деле?

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

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

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

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

Ответ 2

1. Почему runnable?

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

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

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

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

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

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

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

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

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

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

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

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

3. Что такое поток пользовательского интерфейса?

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

Ответ 3

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

Обработчик

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

Runnable

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

UniThread

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

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

Ответ 4

В чем смысл Runnable, если вы можете написать код фона в метод Thread 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

Ответ 5

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

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

Использование Runnable и создание Thread из Runnable - общая практика.

Из учебника оракула concurrency относительно использования Runnable Vs Thread:

Runnable object, является более общим, потому что объект Runnable может подклассифицировать класс, отличный от Thread.

2. Как Handler используется внутри потока и почему мы должны его использовать.

Это обширная тема для объяснения. Проще говоря, с официального сайта документации:

  • Handler позволяет отправлять и обрабатывать объекты Message и Runnable, связанные с потоком MessageQueue, Каждый экземпляр Handler связан с одним потоком и этой очереди сообщений потока.

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

  • Для Handler: (1) используются два основных назначения для планирования сообщений и исполняемых файлов, которые будут выполняться как некоторые моменты в будущем; и (2) для установки действия, которое должно выполняться в другом потоке, чем ваш собственный

  • Когда процесс создается для вашего приложения, его основной поток предназначен для запуска очереди сообщений, которая занимается управлением объектами приложения верхнего уровня (действия, широковещательные приемники и т.д.) и любыми окнами, которые они создают. Вы можете создавать свои собственные потоки и обмениваться данными с основным потоком приложения через обработчик. Это делается путем вызова тех же сообщений или методов sendMessage, как и раньше, но из вашего нового потока. Данный Runnable или Message затем будет запланирован в очереди сообщений обработчика и обработан, если это необходимо.

Эта картина из статьи blog.mindorks.com статьи Анишара Али объясняет понятия ясно.

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

3. У Android есть другая вещь, вызывающая runOnUiThread, как мы ее используем? Я знаю, что он используется для обновления пользовательского интерфейса.

Вы можете найти более подробную информацию, изучив реализацию runOnUiThread

/**
     * Runs the specified action on the UI thread. If the current thread is the UI
     * thread, then the action is executed immediately. If the current thread is
     * not the UI thread, the action is posted to the event queue of the UI thread.
     *
     * @param action the action to run on the UI thread
     */
    public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

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

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