Хотите узнать больше об очередности событий в 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, который не совпадает с тем, о котором мы говорим здесь, но который может быть использован для его реализации.