Я собираюсь попытаться упростить, поэтому будьте терпеливы, если он не точен на 100%.
В основном, обработчик используется для связи с MessageQueue
, связанным с Thread
.Если вы находитесь в основном потоке, или если вы позвонили Looper.prepare()
в Thread
, в котором вы находитесь, у него есть Looper
, который в основном является держателем для MessageQueue
.
Эта очередь постоянно опрашивается, поэтому всякий раз, когда в нее входит Message
, она обрабатывается в потоке, связанном с этим MessageQueue
Если вы пытаетесь выполнить фрагмент кода для определенногоThread
, вы должны использовать Runnable
.Это просто интерфейс с методом void run()
, который будет выполняться Looper на его Thread
.
Допустим, вы выполняете сетевой запрос, вы хотите, чтобы он выполнялся на другом Thread
, но когда вы получите результат, вам нужно как-то передать данные обратно в Main Thread
, чтобы обновить ваш пользовательский интерфейс, потому что View
s нельзя изменить из другого Thread
.Вы бы сделали это так:
// This will let you run method on main thread (even if you're not on main thread)
private final Handler handler = new Handler(Looper.getMainLooper());
// This will let you run method on background thread
private final Executor executor = Executors.newSingleThreadExecutor();
public void doSomething() {
// posting to executor will go to background thread
executor.post(new Runnable() {
@Override
public void run() {
// This will now run on background thread
// you can for example do network request here
// posting to handler will go back to main thread
handler.post(new Runnable() {
@Override
public void run() {
// This will execute on the Main Thread
}
});
}
});
}