Разница между потоком и обработчиком
Может ли кто-нибудь сказать мне почтение между 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
.