Потоки и обработка событий в Java

#java #android #multithreading #event-handling

#java #Android #многопоточность #обработка событий

Вопрос:

Я новичок в Java и Android тоже новичок. Я работаю над игрой и пытаюсь понять точную природу событий в Java и Android. У меня есть несколько вопросов, которые помогут понять правильный способ обработки событий в моем приложении.

Это сетевая игра, и поэтому мне нужно проверить, сделал ли пользователь ход или нет, чтобы обновить представление. Также мне нужно предложить пользователю сделать ход, если он занимает слишком много времени. Для этого у меня есть два потока —

  • Поток таймера истекает каждые 10 секунд и при необходимости вызывает updateview или предлагает пользователю сделать ход.
  • Поток событий создается, когда пользователь нажимает на экран, чтобы выполнить перемещение, или нажимает на меню и т.д.

Правильный ли это подход? Эти два могут быть запущены в любое время.

Вот проблемы, которые я вижу с этим —

  • Что происходит, когда один поток запускается, когда другой активен.
  • Какой поток имеет приоритет, если оба запущены одновременно.
  • Попадают ли события в поток таймера в очередь?
  • Если да, могу ли я выбрать, какой из них в очереди использовать?
  • Могу ли я отменить события в очереди? Например, если у меня есть 2 события updateview, выстроенные в очередь, мне нужно вызвать это только один раз.

Спасибо за любые входные данные.

P

Ответ №1:

Я бы посоветовал ознакомиться с Android AsyncTask.

Комментарии:

1. Спасибо за отзыв. Я читаю это и посмотрю, как это использовать.

2. Спасибо, AsyncTask очень хорош. Я также узнал несколько очень полезных вещей о потоках и потоках пользовательского интерфейса в Android в целом, читая об асинхронных задачах.

Ответ №2:

Учтите, что вы можете реализовать таймер без использования потока. Используйте один обработчик, включающий what, и отправляйте postMessageDelayed (сколько 0, миллисекунды) обработчику, скажем, каждую секунду. Вы могли бы установить переменную counter равной нулю и проверять флаг каждую секунду в обработчике what 0, увеличивая счетчик на единицу. Если значение равно >= десять, отправьте сообщение и сбросьте переменную на ноль. Если пользователь выбирает действие, сбросьте переменную экземпляра на ноль.

Трудоемкое действие может быть запущено в отдельном потоке, который по завершении отправляет обработчику сообщение, возможно, используя what 1. Или вы могли бы выполнить трудоемкое действие в отдельной AsyncTask.

JAL

Комментарии:

1. Спасибо за отзыв, я попробую сделать это таким образом и посмотрю, как это получится.