Обработчик, созданный в основном потоке, действует так же, как в другом потоке - PullRequest
0 голосов
/ 27 июня 2018

Как гугл говорит:

Обработчик позволяет отправлять и обрабатывать объекты Message и Runnable. связанный с MessageQueue потока. Каждый экземпляр обработчика связан с одним потоком и очередью сообщений этого потока. когда вы создаете новый обработчик, он привязан к потоку / очереди сообщений поток, который его создает - с этого момента он будет доставлять сообщения и runnables в эту очередь сообщений и выполнять их, как они выйти из очереди сообщений.

И я ожидаю, что когда я создаю обработчик в главном потоке (потоке пользовательского интерфейса), он присоединяется к этому потоку, поэтому он останавливает пользовательский интерфейс до завершения своей задачи. Но в тесте этого не происходит, и он действует так, как будто он находится на заднем плане и выполняет свою задачу параллельно. Я использовал для создания дескриптора, как это:

 Handler mainHandler = new Handler(Looper.getMainLooper());

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 35000; i++) {
                log.i(TAG,"log in Handler:"+i);
            }}
    };

    mainHandler.post(runnable);
    log.i(TAG,"log outSide");

В mainActivity (поэтому дескриптор должен быть привязан к основному потоку). Так в чем же проблема или я неправильно создал обработчик?

Некоторые друзья замечают, что doSomthing() не достаточно сложен, но почему мы видим «log outSide» перед «log in Handler:», если они находятся в одном потоке.

1 Ответ

0 голосов
/ 27 июня 2018

На самом деле, он работает, как вы ожидали, ваш обработчик в настоящее время связан с вашим основным потоком, потому что он создан в нем, и ваша задача также выполняется на том же. Попробуйте добавить Thread.sleep (1000) метод в ваш цикл for, тогда вы увидите остановку в вашем пользовательском интерфейсе. Ваш текущий код работает со сложностью O (1), так как ваш N является постоянным, и ваш телефон способен достаточно, чтобы выполнить это за доли секунды, поэтому вы не наблюдаете никаких зависаний в вашем пользовательском интерфейсе во время теста.

...