2012-02-24 4 views
-1

У меня есть школьное задание о создании клиента чата на основе UDP на Android. Теперь, моя первая идея состояла в том, чтобы сделать активность, которая запускает сервис, и служба обрабатывает всю сеть и активность, все входные данные выводят. Но проблема нашла.UDP-чат на android

Если я попытаюсь запустить службу, чтобы запустить startCommand и вызывает socket.receive, чтобы начать получать сетевое сообщение, я не могу привязать эту услугу, чтобы я мог передавать входные данные из активности в службу (input = сообщения, которые пользователь хочет отправить). Он просто зависает и генерируется исключение ANR. Если я только привязываю его (так что прием никогда не вызывается), он работает как заклинание.

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

+0

Не видя кода, его трудно диагностировать. Мое первое предположение заключалось в том, что вы запускаете свои сетевые функции в потоке службы (которая является основным потоком пользовательского интерфейса). Это блокирует его, и вы получаете ANR. Вы всегда должны запускать сетевые вызовы в отдельном потоке. –

ответ

1

Я сделал что-то вроде этого один раз. Я взял необходимые данные, необходимые для отслеживания другого устройства и отправил его в asyncTask, где я выпустил Runnable, который в основном поддерживал соединение в фоновом режиме. (Таким образом, вам не нужно беспокоиться о привязке), я нашел что вместо создания ваших собственных соединений сокетов проще всего использовать Apache Mina или Netty. (Нет необходимости изобретать велосипед). Если вы просто передаете передачи данных из сеанса, выполняющегося в фоновом режиме, в список или в очередь, и попросите асинхронную проверку и обновите интерфейс, вы должны быть настроены для общения в чате. Может быть, это не лучший способ, но это сработало для меня. Надеюсь, что это помогает.

+0

Спасибо за ответ, но весь смысл задания - изобретать колесо ... поэтому мне нужно заставить его работать с базовым UDP. – Mockarutan

+0

Это нормально, похоже, что у вас есть ваши сокеты, работающие вне android os. Так как alextsc подразумевал, что я думаю, что вы запутались в том, как работают сервисы. Службы - это не то же самое, что и потоки. Несмотря на то, что вы связываете службу, вам все равно нужно создать отдельный поток для вашего получателя и вызвать новый поток для отправляемого сообщения. Таким образом, вы могли бы в любое время использовать три потока, выполняющих отправитель, получатель и активность, выполняемые в пользовательском интерфейсе. – shibbybird

+0

AsyncTask сделал трюк! Спасибо за ответы! – Mockarutan

Смежные вопросы