В чем разница между этими методами для запуска кода в потоке пользовательского интерфейса? - PullRequest
0 голосов
/ 01 октября 2019

В Интернете опубликованы различные методы запуска кода в потоке пользовательского интерфейса. Все они выполняют одну и ту же задачу, однако я действительно хочу знать разницу между этими методами.

Метод 1:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

Метод 2:

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

Метод 3:

 runOnUiThread(new Runnable() {
     @Override
     public void run() {
     // Code here will run in UI thread
     }
 });

Ответы [ 3 ]

1 голос
/ 01 октября 2019

Метод 1 всегда будет работать.

Метод 2 будет работать, только если вы уже находитесь в потоке пользовательского интерфейса - новый обработчик без параметра Looper создает обработчик для текущего потока (и завершается неудачей, если в текущем потоке нет Looper).

Метод 3 должен выполняться в Activity или вызываться для объекта Activity, поскольку runOnUiThread является функцией Activity. Но под капотом он будет делать то же самое, что и 1 (хотя, вероятно, один и тот же обработчик делает его более эффективным, а не всегда новым).

1 голос
/ 02 октября 2019

В Android у Нити может быть один Looper или MessageQueue. Обработчик используется для отправки сообщения или сообщения Runnable в MessageQueue потока, и он всегда должен быть связан с Looper или MessageQueue потока.

Метод 1

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

Когда приложение открывается, Android создает новый поток (называемый основным потоком или потоком пользовательского интерфейса) с Looper и MessageQueue, этот поток используется для визуализации пользовательского интерфейса и обработки входных событий от пользователей.

Приведенный выше код создает обработчик и связан с Looper потока пользовательского интерфейса, поэтому исполняемый файл будет поставлен в очередь в MessageQueue потока пользовательского интерфейса и будет выполнен позже.

Метод 2

new Handler().post(new Runnable() {
    @Override
    public void run() {
        // Code here will run in UI thread
    }
});

При создании обработчика и связанного с Looper текущего потока существует 3 случая:

  • Если этот код выполняется в потоке пользовательского интерфейса, то исполняемый файл будетбыть поставлен в очередь в MessageQueue потока пользовательского интерфейса и будет выполнен позже.
  • Если этот код выполняется в фоновом потоке, если этот поток имеет Looper, то исполняемый файл будет поставлен в очередь в MessageQueue фонового потока и будетвыполняется позже.
  • Если этот код выполняется в фоновом потоке и этот поток не имеет Looper, то будет выдано исключение.

Метод 3

runOnUiThread(new Runnable() {
     @Override
     public void run() {
     // Code here will run in UI thread
     }
});

runOnUiThread - это просто служебный метод Activity, который используется, когда вы хотите выполнить некоторый код в потоке пользовательского интерфейса. Логика, лежащая в основе этого метода, заключается в том, что если текущий поток является потоком пользовательского интерфейса, то выполните его немедленно, в противном случае используется Handler для отправки сообщения в MessageQueue потока пользовательского интерфейса (например, метод 1).

0 голосов
/ 01 октября 2019

Все методы работают следующим образом:

Обработчик цикла метода 1, если цикл существует

Обработчик метода 2 может работать во всех действиях, если он не является частным или желаемым

Обработчик метода 3может работать только в текущей деятельности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...