Хотите узнать больше об очередности событий в Android UI

Всюду по сети и по переполнению стека есть ссылки на поток пользовательского интерфейса Очередь событий. Например, runOnUiThread() отправит действие в очередь событий потока пользовательского интерфейса. Но я не смог найти подробное описание этой очереди, так может кто-то, пожалуйста, назовите меня подробным или ответьте на несколько вопросов?

1. Я получаю, что это очередь, и что она содержит "действия", но я немного не понимаю, что такое "действие". Являются ли вызовы методов действий связанными с ними параметрами или инструкциями для самого потока или что?

2. У всех потоков есть очереди событий или только поток пользовательского интерфейса?

3. Как я могу узнать, что в очереди событий, или получить количество событий?

4. Что именно определяет, когда выполняется действие в очереди?

5. Класс View имеет метод cancelPendingInputEvents(), который используется для "Отмена любых отложенных событий ввода на высоком уровне, которые ранее были отправлены в очередь событий". Если очередь событий является свойством потока, почему это метод класса View или представления имеют некоторую другую очередь событий?

6. Являются ли очереди сообщений и очереди событий двумя разными очередями? NB - кто-то спросил об этом на SO здесь, и ответчик начал с того, что они были синонимами, а затем добавили добавление которые, казалось, предполагали, что сообщения были разными, поэтому я не знаю, каков был окончательный ответ.

Ответ 1

  • это очередь с Runnables. Поток вызывает run(); для каждой из runnables.
  • только те потоки, которые называются Looper.prepare(), поэтому любой поток может потенциально иметь их. Там Runtime Exception для этого: "Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()"
  • Вы не можете. Вещь управляется платформой и вызывает обратные вызовы активности, обратные вызовы фрагментов, диспетчерские события касания, запуск анимации, запуск макета, измерение и рисование. Все это в потоке пользовательского интерфейса.
  • AFAIK это FIFO. Но я могу ошибаться в этом.
  • В представлениях есть обработчик потока пользовательского интерфейса. Обработчики привязаны к потоку, а MessageQueue. Так как вы можете создать новый обработчик потока пользовательского интерфейса, вызвав new Handler() в потоке пользовательского интерфейса. Затем отправьте материал в очередь потока, вызвав handler.post(Runnable)
  • Я не верю, что они разные. Но нужно было бы копать исходный код, чтобы быть уверенным.

Всегда полезно читать документы:

https://developer.android.com/reference/android/os/Handler.html

https://developer.android.com/reference/android/os/MessageQueue.html

Ответ 2

Это просто стандартный цикл сообщений, как и любая платформа графического интерфейса. "Событие" - это термин CS, а не конкретный объект. Представьте, что внутри рамки Android вы увидите что-то вроде этого:

MessageQueue queue;
void run(){
    while(1){
        queue.waitForEvent();
        Message msg = queue.getEvent();
        //Handle msg
    }
}

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

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

События выполняются, как только поток может. Если в очереди нет событий, поток засыпает. Они должны выполняться по порядку, хотя структура может обманывать некоторые события.

Очередь сообщений и очередь событий - это одно и то же. Там также класс MessageQueue, который не совпадает с тем, о котором мы говорим здесь, но который может быть использован для его реализации.