Разница между потоком и обработчиком

Может ли кто-нибудь сказать мне почтение между Thread и Handler? Когда мы используем Thread и когда используем Handler?

У меня есть два кода в моем проекте, но я не могу их понять.

final Handler handler =  new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        //  Do SomeThings
    } 
};

И

private class readThread extends Thread
{
    Handler mHandler;

    readThread(Handler h){
        mHandler = h;
        this.setPriority(Thread.MIN_PRIORITY);

    }

    @Override
    public void run()
    {
        //  Do SomeThings
    }
}

И в другом методе вызовите обработчик следующим образом

read_thread = new readThread(handler);
            read_thread.start();

Какой из них запускается первым? Может кто-нибудь объяснить мне?

Ответ 1

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

Разница: представьте, что у вас есть Runnable r = new Runnable{...}

  • Когда вы используете new Thread(r).start(), вы фактически создали новый поток для запуска задачи асинхронно.

  • Когда вы используете new Handler().post(r) (или Message), вы добавили объект Runnable к Looper и выполните код позже в том же потоке.

A Thread, обычно MainThread или UIThread содержит a Looper. Когда MainThread запускается, он будет циклически зацикливать Looper и выполнить Runnable по очереди.

Когда Thread предпочтительнее:

Когда вы выполняете тяжелую работу, такую ​​как сетевая связь или декодирование больших файлов растровых изображений, предпочтительным является новый поток. Если требуется много потоков, возможно, ExecutorService предпочтительнее. https://developer.android.com/reference/java/util/concurrent/ExecutorService.html

Когда предпочтительнее обработчик:

Если вы хотите обновить объекты пользовательского интерфейса (например, текст TextView) из другого потока, необходимо, чтобы объекты пользовательского интерфейса могли обновляться только в потоке пользовательского интерфейса. Кроме того, когда вы просто хотите запустить некоторый световой код позже (например, задержка на 300 мс), вы можете использовать Handler, потому что он легче и быстрее.

См. также: Обработчик против AsyncTask vs Thread

Ответ 2

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

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

Так, например, покажите тост или обновите индикатор выполнения через сообщение (Runnable), отправленное в обработчик, но вы не можете, если вы запустите этот runnable как поток.

С обработчиком вы также можете иметь такие вещи, как MessageQueuing, планирование и повторение.

Мне еще нужно столкнуться с ситуацией, когда мне нужен поток в android.

В основном я использую комбинацию AsyncTasks и Handlers.

Обработчики для вышеупомянутых задач.

AsyncTasks для загрузки/выбора данных и опроса и т.д.

Ответ 3

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

Handler сам не предоставляет каких-либо механизмов для фонового задания - это просто инструмент для доступа к очереди сообщений (Looper), связанной с некоторым потоком. По умолчанию пользовательский интерфейс имеет Looper, поэтому рекомендуется обновлять интерфейс с помощью Handler.post(Runable), что означает выполнение некоторой части кода в потоке, которая связана с этим Handler.
Как только Handler служит Looper, он не может быть создан в потоке, который не связан с Looper.