2012-08-15 11 views
6

Używam asmacka do androidowej aplikacji IM, w której korzystam z usługi zdalnej z interfejsem AIDL.jak radzić sobie z utrzymywaniem połączenia przy życiu w Androidzie Serwis

Wewnątrz metody onStartCommand mojej usługi piszę kod jak poniżej. Tworzę połączenie, a następnie loguję się przy użyciu tego. Kiedy ktokolwiek uruchomi moją aplikację wewnątrz onCreate metoda głównej aktywności mojej aplikacji uruchom moją usługę getApplicationContext.StartService(serviceIntent). Działa to dobrze, ale po kilku minutach (czasem 10 minut i po pewnym czasie więcej niż dziesięciu) messageListener dołączam wewnątrz przystanków serwisowych, aby odbierać wiadomości. Ale wiem, że połączenie istnieje, ponieważ w tym samym czasie używam xmppConnection do wysyłania wiadomości, która wysyła wiadomość do użytkownika B, ale nie odbiera wiadomości od użytkownika B. Nie wiem, dlaczego mój słuchacz przestał słyszeć wiadomość.

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; 
    } 
} 

Proszę podać.

+0

Proszę sformatować swój kod i wybrać dobry tytuł dla swojego posta. – Flow

+0

Problem polega na tym, że moje połączenie istnieje, ale przestaje słuchać pakietu. Używając tego połączenia, wołam sendPacket, który działa dobrze, ale nie wiem, dlaczego przestaje słuchać pakietu przychodzącego. Sprawdzam moją usługę również działającą w backendach, ponieważ mogę wysłaćPacket z usługa wysyłania pakietów wiadomości, proszę przypomnienie. Mam do czynienia z tym samym problemem, co opublikowany pod poniższym linkiem. http://stackoverflow.com/questions/5040852/packet-listener-in-android-service – aftab

+0

Twój opublikowany link wydaje się być odpowiedzią ----> http://stackoverflow.com/questions/5040852/packet-listener -in-android-service – sascha10000

Odpowiedz

4

Czy Twoje połączenie jest zamknięte z powodu błędu, a Ty nie zauważyłeś? Należy dodać odbiornik połączeń i dziennik dla każdego wywołania zwrotnego w celu debugowania stanu połączenia.

Na Androidzie można mieć gniazdo "zombie": nadal można do niego pisać, ale odbiorca nigdy nie odbierze wiadomości i oczywiście nie będzie mógł odczytać z niej nowych wiadomości. Może się to zdarzyć po zmianie statusu sieci.

Aby wykryć, że używam XMPP Ping, zainicjowałem od klienta z alarmu (co 15 minut z niedokładnym powtórzeniem). A ja wyłączam białą przestrzeń, by utrzymać się przy życiu. To pokonuje większość mechanizmów limitu czasu, które mogą istnieć między klientem a serwerem (NAT lub proxy). Plus, jeśli nie otrzymasz żadnej odpowiedzi na ping (na przykład w ciągu 20 sekund), możesz założyć, że połączenie jest w złym stanie i ponownie połączyć się ręcznie.

+0

Drogi Guillaume Perrot: Dziękuję za odpowiedź. Mam do czynienia z dziwnym problemem. Używam usługi AIDL do obsługi mojego połączenia przy życiu. Wysyłam i odbieram wiadomości, które działają poprawnie. Ale za pomocą obiektu XMPP wysyłam prośbę o zaproszenie do subskrypcji do użytkownika, który wysyła pakiet żądania w porządku. Ale tutaj pojawia się problem, gdy jego słuchacz pakietów przestaje słuchać pakietów przychodzących. W tym samym czasie próbuję wysłać pakiet za pomocą tego samego obiektu xmpp, który wysyła ok, ale odbierający stop, aby usłyszeć przychodzący pakiet. Wygląda na to, że detektor pakietów xmpp przeszkadza po wysłaniu żądania zaproszenia. Proszę przewodnika. . – aftab

+0

Klasa AndroidDebugger (ConsoleDebugger na zwykłym Smacku) może być używana do drukowania tego, co faktycznie zostało odczytane lub zapisane na gnieździe bez użycia API PacketListener. Powinieneś sprawdzić, czy odbierasz pakiety w dziennikach debuggera, gdy słuchacz przestanie działać. –