2015-08-01 2 views
12

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

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

+0

Вы не используете поле mHandler в readThread, для чего это нужно? – pskink

+0

Не знаю. Я ничего не знаю об этих кодах. Я пытаюсь unedrestand их – Khodayar

ответ

21

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

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

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

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

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

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

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

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

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

Пожалуйста, обратитесь к: Handler vs AsyncTask vs Thread

3

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

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

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

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

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

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

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^