Для чего нужны обработчики и Runnables в Android? - PullRequest
1 голос
/ 10 марта 2019

Пожалуйста, я заблокирован этой концепцией обработчиков и Runnables в Android.Может кто-нибудь дать мне подробное объяснение по Handlers и Runnables?Их синтаксис и реализация?Я прочитал много статей по этому вопросу, но концепции до сих пор не ясны и даже развернуты на Java.Заранее спасибо

1 Ответ

5 голосов
/ 10 марта 2019

Я собираюсь попытаться упростить, поэтому будьте терпеливы, если он не точен на 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
                }
            });
        }
   });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...