Зачем запускать Handler в основном потоке Looper - PullRequest
0 голосов
/ 13 декабря 2018

Я прочитал, что обработчик Android может использоваться для связи с основным потоком Looper для публикации сообщений, которые будут взаимодействовать с представлениями (поскольку только основные потоки могут взаимодействовать с представлениями там))

Но я часто вижу код, подобный приведенному ниже примеру, который запускает обработчик в главном потоке.Почему это хорошая мысль сделать, она чувствует себя ненужным, если нет задержки, как postDelayed(new Runnable()...

Любое объяснение этого было бы неплохо

public class TaleDemoActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);

        new Handler().post(new Runnable() {
            @Override
            public void run() {
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        new Tale("Hello runnables!").tell();
                    }
                });
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        new Tale("Hello runnables!").at().tell();
                    }
                });
            }
        });

        new Handler().post(new TestRunnable());
        new Handler().post(new TestStaticRunnable());

        new Handler().post(new TestAbstractRunnable() {
            @Override
            public void run() {
                new Tale("Hello abstract runnable!").tell();
            }
        });
        new Handler().post(new TestInterfaceRunnable() {
            @Override
            public void run() {
                new Tale("Hello test interface runnable!").tell();
            }
        });

        new Tale().at().tell();
    }

    class TestRunnable implements Runnable {
        @Override
        public void run() {
            new Tale("Hello testRunnable!").tell();
        }
    }

    static class TestStaticRunnable implements Runnable {
        @Override
        public void run() {
            new Tale("Hello testStaticRunnable!").tell();
        }
    }

    abstract class TestAbstractRunnable implements Runnable {

    }

    interface TestInterfaceRunnable extends Runnable {

    }
}

1 Ответ

0 голосов
/ 13 декабря 2018

Обработчик используется не только для связи с main Looper.

Looper - это класс, который зацикливается на очереди сообщений и отправляет их, каждый экземпляр работает с одним Thread.

A HandlerThread - это Thread, к которому также прикреплен Looper.

«Основной» Thread вашего приложения также является HandlerThread.

Когда вы создаете экземпляр Handler с пустым конструктором, Handler будет присоединен к Looper из Thread, в котором вы создаете экземпляр.Например, если вы создаете Thread в onCreate из Activity, тогда Handler будет присоединен к основному (UI) Thread, потому что там выполняются обратные вызовы жизненного цикла.

Когда вы вызываете post(Runnable), Runnable будет запущен в потоке, к которому прикреплен Handler Looper.Таким образом, если вы создаете Handler в одном из обратных вызовов жизненного цикла вашего Activity, то независимо от того, с какого Thread вы отправляете Runnable, он всегда будет выполняться на главном Thread

Это наиболее распространенное использование, и это то, что делает ваш код, но это не единственный.Например, вы можете создать экземпляр HandlerThread, затем из обратных вызовов жизненного цикла Activity вы можете опубликовать Runnable, который выполняет очень длинную операцию, и он не будет блокировать ваш пользовательский интерфейс, потому что он будет выполняться на другом Thread.

Другое использование post(Runnable) (а иногда и универсальное грязное исправление для странных ошибок пользовательского интерфейса) - вызывать его из основного потока просто с целью задержки выполнения до тех пор, пока не будет выполнен весь метод.

fun onCreate(savedInstanceState: Bundle?) {
    Handler().post {
        // code here is executed after `onCreate` has returned
    }
    // code here is executed before the one posted on the Handler
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...