#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. Спасибо за отзыв, я попробую сделать это таким образом и посмотрю, как это получится.