Intereting Posts
Является ли onDestroy () гарантированно вызванным для фрагментов? Android GCM: другой способ обработки push в зависимости от того, видимо ли приложение или нет Как установить разные темы для раздутого макета в виде заглушки Требуется ли для проверки счетов реальная кредитная карта для покупки через In-app Billing? Побочные эффекты изменения фильтра и требования к существующему приложению в Android Play / Market Android ListView в действии становится обновленным при изменении ориентации WebView и HTML5 <video> Как андроид устанавливает пользовательский шрифт в холсте? Обратный вызов Ble scan вызывает только несколько раз, а затем останавливается Подвеска в Google Play Store Как установить голографическую темную тему в приложении для Android? Android – фрагмент .replace () не заменяет содержимое – помещает его поверх Ошибка авторизации API Google Android v2 Рабочий пример использования Twitter API на Android? Проверка версии Android в приложении

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "Хотите узнать больше о очереди событий в Android UI Thread"

  1. Это очередь с Runnables. Поток вызывает run(); На каждой из стоков.
  2. Только те потоки, которые называются Looper.prepare() , поэтому любой поток может их потенциально использовать. Существует исключение Runtime Exception для этого: «Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()»
  3. Вы не можете. Вещь управляется платформой и вызывает обратные вызовы активности, обратные вызовы фрагментов, диспетчерские события касания, запускает анимацию, запускает макет, измеряет и рисует. Все это в потоке пользовательского интерфейса.
  4. AFAIK это FIFO. Но я могу ошибаться в этом.
  5. В представлениях есть обработчик потока пользовательского интерфейса. Обработчики привязаны к потоку, и это MessageQueue. Вот как вы можете создать новый обработчик потока пользовательского интерфейса, вызвав new Handler() в потоке пользовательского интерфейса. И затем отправляйте материал в очередь потока, вызывая handler.post(Runnable)
  6. Я не верю, что они разные. Но нужно было бы копаться в исходном коде, чтобы быть уверенным.

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

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

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

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

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

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

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

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

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