как обрабатывать постоянное соединение в службе Android

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

Внутри метода 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;
    }
}

Пожалуйста, направляйте.


person aftab    schedule 15.08.2012    source источник
comment
Пожалуйста, отформатируйте свой код и выберите хороший заголовок для своего поста.   -  person Flow    schedule 16.08.2012
comment
Проблема в том, что мое соединение существует, но оно перестает слушать пакет. Используя это соединение, я вызываю sendPacket, который работает нормально, но не знаю, почему он перестает слушать входящий пакет. Я проверяю, что моя служба также работает на бэкэнде, потому что я могу отправить пакет из службы для отправки пакета сообщений,Пожалуйста, направляйте. Я столкнулся с той же проблемой, что и опубликованная по ссылке ниже. stackoverflow.com/questions/5040852/   -  person aftab    schedule 18.08.2012
comment
На вашу размещенную ссылку, похоже, ответили ----›stackoverflow .com/questions/5040852/   -  person sascha10000    schedule 18.08.2012
comment
Нет. Я также выполняю эти шаги. Похоже, моя служба остается в живых, но проблема связана с прослушивателем соединения xmpp. Он перестает прослушивать пакеты. И Logcat ничего не показывает, связанного с уничтожением службы.   -  person aftab    schedule 18.08.2012


Ответы (1)


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

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

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

person Guillaume Perrot    schedule 20.08.2012
comment
Уважаемый Гийом Перро, спасибо за ваш ответ. Я столкнулся со странной проблемой. Я использую службу AIDL для обработки моего постоянного соединения. Я отправляю и получаю сообщения, которые работают нормально. Но, используя объект XMPP, я отправляю пользователю запрос на приглашение на подписку, и он отправляет пакет запроса в порядке. Но здесь проблема в том, что его прослушиватель пакетов перестает прослушивать входящие пакеты. В то же время я пытаюсь отправить пакет, используя тот же объект xmpp, который отправляет нормально, но прием прекращается, чтобы услышать входящий пакет. Похоже, прослушиватель пакетов xmpp беспокоит после отправки запроса на приглашение. Пожалуйста, направляйте. . - person aftab; 21.08.2012
comment
Класс AndroidDebugger (ConsoleDebugger в обычном Smack) можно использовать для вывода того, что на самом деле читается или пишется в сокете, без использования PacketListener API. Вы должны проверить, получаете ли вы пакеты в журналах отладчика, когда ваш слушатель перестает работать. - person Guillaume Perrot; 05.09.2012