#android #multithreading #timer
#Android #многопоточность #таймер
Вопрос:
Я пишу социальную игру, но я застрял в том, как создать поток таймера, который работает через действия, показывающие промежуток времени для такого атрибута, как энергия. Каждое действие имеет текстовое представление energy, но поток может обновлять только одно представление за раз. Пожалуйста, обратите внимание, что я не использую класс таймера андроидов, но создал свой собственный класс потоков.
Ответ №1:
Вероятно, вы не хотите пытаться поддерживать поток между действиями. Управление им, когда действие приостанавливается, не даст вам ничего, кроме головной боли. Гораздо проще просто сохранять ваше время в приложении, пока вы переходите от действия к действию. Приложение работает в течение всего времени, независимо от того, какое действие фактически загружено. Тот факт, что у вас есть TextView с одинаковым именем в различных действиях, ни здесь, ни там … это не «тот же» TextView … он просто выглядит (и пахнет) похожим. Таким образом, вы можете просто взять часы при первом запуске приложения и в любой момент посмотреть на разницу между текущим и текущим временем.
Затем просто используйте таймер для обновления строки в любой деятельности, в которой вы находитесь.
Если вы не знакомы с приложением, для вас это будет настоящей Эврикой (по какой-то причине в руководствах по Android это ВСЕ время упускается из виду, оставляя вас делать всевозможные действительно уродливые альтернативы передачи намерений).
Если у вас есть какие-либо вопросы о том, как его использовать, просто оставьте комментарий, и я добавлю подробности.
Комментарии:
1. Сценарий таймера заключается не только в использовании текущего времени. Позвольте мне объяснить немного подробнее: параметр энергии проигрывателя равен 12/12. поэтому всякий раз, когда энергия уменьшается хотя бы на один пункт ниже 12, запускается таймер на 4 минуты, который обновляет текстовое представление, такое как energyTimerTextView, который помещается в заголовок каждого действия. Я уже использовал фрагмент для заголовка, в котором размещается это текстовое представление. И удалось заставить его работать с потоком универсального таймера, который помещает время, прошедшее в sharedpreferrences, откуда любой textview может считывать и отображать. но я думаю, что это большой перебор
2. Чтение SharedPreferences — это довольно хорошие мили на галлон, но я все еще не понимаю, почему вы просто не вводите переменную в приложение, которая хранит любое время, которое является вашим временем «начала», а затем просто сравнивает с этим, когда этого требуют ваши потребности. Вы так же легко сбрасываете его, если это то, что вам нужно. Должно быть, я неправильно понимаю ваши потребности, потому что мне кажется, что это очевидная вещь.
3. Доктор Дредел на самом деле совершенно прав в этом. Вероятно, лучше всего решить проблему, переопределив приложение, включив в него статический таймер, который можно запускать и останавливать в соответствии с любыми вашими действиями. Это супер-простой способ обработки вещей, которые должны быть разделены между компонентами, и позволяет избежать ненужных потоков и передачи намерений. Поскольку вы уже переопределили свой собственный таймер, это не должно быть проблемой для вас.
4. Я подумал, можем ли мы использовать fragment для решения этой проблемы, поскольку фрагмент всегда будет содержать textview, с помощью которого я пытаюсь подключить таймер. Я пытался сохранить фрагмент, но всегда вызывается новый при создании нового действия. любая помощь в этом?
5. Я думаю, вам в корне не хватает того, как работают действия. Активность — это автономная вещь. Вам нужно думать об этом, как о веб-странице. Веб-страница ничего не знает ни о какой другой веб-странице, и если вам нужно 2 веб-страницы для обмена информацией, вы должны что-то сделать, чтобы это стало реальностью (файлы cookie, строки запросов и т. Д.). Действия, по крайней мере, в этом отношении, очень похожи. Разница в том, что у вас есть приложение, которое находится над всеми действиями (которые приходят и уходят) и поддерживает состояние. Так что … просто используй это!
Ответ №2:
Я думаю, вы должны подумать об использовании сервиса :
Таким образом, сама услуга на самом деле очень проста, предоставляя две основные функции:
- Средство, позволяющее приложению сообщать системе о том, что оно хочет делать в фоновом режиме (даже если пользователь напрямую не взаимодействует с приложением). Это соответствует вызовам Context.startService() , которые просят систему запланировать работу для службы, которая будет выполняться до тех пор, пока служба или кто-то другой явно не остановит ее.
- Средство, позволяющее приложению предоставлять некоторые свои функциональные возможности другим приложениям. Это соответствует вызовам Context.bindService(), который позволяет устанавливать долговременное соединение с сервисом для взаимодействия с ним. Когда компонент службы фактически создается, по любой из этих причин все, что на самом деле делает система, — это создает экземпляр компонента и вызывает его onCreate() и любые другие соответствующие обратные вызовы в главном потоке. Служба должна реализовать их с соответствующим поведением, например, создать вторичный поток, в котором он выполняет свою работу.
Комментарии:
1. Если я понимаю его потребности, услуга в этой ситуации является излишней, но да, это альтернатива.