2012-08-15 2 views
6

Я использую asmack для приложения IM в андроиде, где я использую удаленный сервис с интерфейсом AIDL.как обрабатывать поддерживать соединение в android Service

Внутри onStartCommand метод моего обслуживания Я пишу код, как показано ниже. Я создаю соединение, а затем подключаюсь к нему с помощью этого. Когда кто-нибудь запускает мое приложение внутри onCreate, метод основной деятельности моего приложения запустит мою службу getApplicationContext.StartService(serviceIntent). Он работает нормально, но через несколько минут (иногда 10 минут и некоторое время больше десяти) messageListener, которые я прикрепляю к остановкам обслуживания, чтобы получать сообщения. Но я знаю, что соединение существует, потому что в то же время я использую xmppConnection для отправки сообщения, которое он отправляет пользователю пользователю B, но он не прослушивает сообщения от пользователя B. Я не знаю, почему мой слушатель прекратил слушание сообщения.

public int onStartCommand(final Intent intent, final int flags, final int startId) { 
    ConnectionConfiguration config = new ConnectionConfiguration(URL, MyPort, Host); 
    xmppConnection = new XMPPConnection(config); 
    xmppConnection.connect(); 
    xmppConnection.login("[email protected]", "testpass"); 
    xmppConnection.addPacketListener(myMessageListener, new PacketTypeFilter(Message.class)); 
    return START_STICKY; 
} 
private PacketListener myMessageListener = new PacketListener() { 
    public void processPacket(Packet packet) { 
     Message msg = (Message) packet; 
    } 
} 

Просим руководствоваться.

+0

Пожалуйста, отформатируйте свой код и выберите подходящий заголовок для своего сообщения. – Flow

+0

Проблема в том, что мое соединение существует, но оно останавливается, чтобы прослушивать пакет. Используя это соединение, я вызываю sendPacket, работающий нормально, но не знаю, почему он перестает прослушивать входящий пакет. Я проверяю, что моя служба также работает на сервере, потому что я могу отправитьPacket из служба для отправки пакета сообщений, пожалуйста, направляйте. У меня столкнулась с такой же проблемой, как и по ссылке ниже. http://stackoverflow.com/questions/5040852/packet-listener-in-android-service – aftab

+0

Ваша ответная ссылка, кажется, ответила ----> http://stackoverflow.com/questions/5040852/packet-listener -in-android-service – sascha10000

ответ

4

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

На Android можно установить сокет «зомби»: вы все равно можете написать ему, но получатель никогда не получит сообщения, и, конечно, вы не сможете читать новые сообщения от него. Это может произойти после изменения состояния сети.

Чтобы обнаружить, что я использую XMPP Ping, инициированный клиентом из будильника (каждые 15 минут с неточным повторением). И я отключу пустое пространство. Это поражает большинство механизмов тайм-аута, которые могут существовать между вашим клиентом и вашим сервером (NAT или прокси). Кроме того, если вы не получили ответа на пинг (например, в течение 20 секунд), вы можете предположить, что соединение находится в плохом состоянии и снова подключается вручную.

+0

Дорогой Гийом Перро: спасибо за ваш ответ. У меня возникла странная проблема. Я использую службу AIDL для обработки моего поддерживаемого соединения. Я отправляю и получаю сообщения, которые работают нормально. Но, используя объект XMPP, я отправляю запрос на приглашение подписки пользователю, который отправляет запрос на пакет. Но здесь проблема прерывает приемник пакетов, чтобы прослушивать входящие пакеты. В то же время я пытаюсь отправить пакет, используя тот же объект xmpp, который он отправляет нормально, но принимает остановку для приема входящего пакета. После запроса приглашения на приглашение он воспринимает прослушиватель пакетов xmpp. Пожалуйста, направляйте. , – aftab

+0

Класс AndroidDebugger (ConsoleDebugger on regular Smack) может использоваться для печати того, что на самом деле читается или записывается в сокет без использования API PacketListener. Вы должны проверить, получаете ли вы пакеты в журналах отладчика, когда ваш слушатель перестает работать. –