Как компоненты должны взаимодействовать в многопоточном приложении Android? - PullRequest
0 голосов
/ 05 октября 2019

Я хочу сделать простое приложение для Android, которое должно выполнять тяжелую работу в фоновом режиме. Я совершенно новичок в разработке для Android и мне нужен совет о том, как правильно разработать это приложение. Итак, мое приложение должно запускать сервер в фоновом режиме, который принимает клиента и постоянно обменивается данными с клиентом, пока пользователь не решит остановить сервер. У меня есть простое действие, которое имеет кнопку, которая должна запускать и останавливать сервер. Мои нынешние мысли:

  • Нажатие кнопки должно запустить службу
  • Служба должна запустить отдельный поток, который будет выполнять всю работу сервера.
Я думаю, что я должен создать три класса: Activity класс, Service класс (попросить систему запустить передний план Service, чтобы процесс не был убит, если пользователь закроет Activity), и класс Serverкоторый может быть Thread или AsyncTask. Проблема заключается в том, что в потоке сервера могут происходить некоторые события, о которых должен знать пользователь, поэтому эти события должны вызывать некоторые изменения в пользовательском интерфейсе, например показ сообщения. Я мог бы уведомить пользователя, манипулируя пользовательским интерфейсом в методе onProgressUpdate() или runOnUiThread(), но это не так. Более того, я считаю, что это нарушает принцип единой ответственности, поскольку Сервер выполняет работу, которая не ожидается. Может быть, мне следует как-то уведомить Service, который, в свою очередь, сделает всю работу по уведомлению пользователя? Более того, мне нужно как-то управлять сервером из пользовательского интерфейса. Так что просто позвонить на Service и забыть об этом - не вариант. Итак, мой вопрос, как сделать хороший дизайн приложения? Как компоненты должны взаимодействовать друг с другом?

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Прежде всего, в большинстве случаев устройство Android, выступающее в роли сервера, является плохим дизайном, поскольку провайдеры сотовой телефонной связи в настоящее время назначают частные IP-адреса, а не общедоступные своим клиентам, поэтому ваши прослушивающие порты будут недоступны из Интернета. Он будет работать только в локальной сети и подключен через WiFi.

Ваша серверная задача не обязательно должна быть создана в службе, она может быть создана в других классах приложения, но вам нужно будет создатьСлужба, если вы хотите, чтобы поток сервера не останавливался, когда телефон переходит в спящий режим, поэтому во избежание этого вам необходимо создать службу Foreground (служба, которая вызывает startForeground ()), а также использовать PowerManager.WakeLock.

Чтобы связать задачу с потоком пользовательского интерфейса, я рекомендую вам использовать сообщения, для этого для работы в потоке пользовательского интерфейса вы создаете экземпляр производного класса Handler и перезаписываете метод handleMessage ().

Из потока сервера вы можете отправлять сообщения с помощью sendMessage () в производный экземпляр Handle, и вы будете получать их в handleMessage () в потоке пользовательского интерфейса.

0 голосов
/ 05 октября 2019

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

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

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

Событие инициируется действием и намерением в методе onReceive приемника вещания, который вы объявили в действии или фрагменте. Здесь вы можете обновить пользовательский интерфейс, получив данные из намерения

Прочитайте обзор трансляции из официального документа разработчика Android

https://developer.android.com/guide/components/broadcasts надеюсь, что это поможет вам

...