Я создаю приложение для Android, которое регулярно связывается с сервером, пока приложение работает.
Я делаю это, инициируя подключение к серверу при запуске приложения, тогда у меня есть отдельный thread
для получения сообщений с именем ReceiverThread
, этот thread
читает сообщение из socket
, анализирует его, и пересылает его в соответствующую часть приложения.
Этот thread
работает в цикле, считывая все, что ему нужно прочитать, а затем блокирует команду read()
до тех пор, пока не появятся новые данные, поэтому он тратит большую часть времени на блокировку.
Я обрабатываю отправку сообщений через другой поток, называемый SenderThread
. Мне интересно, должен ли я структурировать SenderThread
аналогичным образом? Смысл должен ли я поддерживать некоторую форму очереди для этого потока, пусть он отправляет все сообщения в очереди, а затем блокирует до тех пор, пока в очередь не войдут новые сообщения, или я должен просто начать новый экземпляр потока каждый раз, когда сообщение нужно отправить, пусть он отправит сообщение, а затем "умрет"? Я склоняюсь к первому подходу, но я не знаю, что на самом деле лучше как с точки зрения производительности (сохранение заблокированного потока в памяти и инициализация новых потоков), так и с точки зрения правильности кода.
Кроме того, поскольку все мои действия должны иметь возможность отправлять и получать сообщения, я держу ссылку на оба потока в классе Application
, является ли приемлемый подход или я должен реализовать его по-другому?
Одна из проблем, с которыми я столкнулся, заключается в том, что иногда, если я закрываю приложение и запускаю его снова, у меня на самом деле есть два экземпляра ReceiverThread, поэтому я получаю несколько сообщений дважды.
Я предполагаю, что это потому, что мое приложение фактически не закрывалось, и предыдущий поток все еще был активным (заблокирован в операции read()
), и когда я снова открыл приложение, новый поток был инициализирован, но оба были связаны на сервер, чтобы сервер отправил сообщение обоим. Любые советы о том, как обойти эту проблему или о том, как полностью переорганизовать ее, чтобы она была правильной?
Я попытался найти эти вопросы, но нашел некоторые противоречивые примеры для моего первого вопроса и ничего полезного и применил к моему второму вопросу...