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

Может ли кто-нибудь сказать мне почтение между 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(); 

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

Solutions Collecting From Web of "Разница между потоком и обработчиком"

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

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

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

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

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

Когда Thread является предпочтительным:

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

Когда обработчик является предпочтительным:

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

См. Также: Handler vs AsyncTask vs Thread

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

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

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

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

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

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

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

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

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

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