2013-03-22 14 views
5

Dzwonię do usługi internetowej z mojej aplikacji na Androida. Mam wiele różnych połączeń do tej usługi przez całą aplikację, a każdy z nich zwraca dane w czasie krótszym niż sekunda, z wyjątkiem jednego. Jedno z moich zgłoszeń może potrwać nawet minutę, aby zwrócić te dane, mimo że faktyczne połączenie z serwisem jest bliskie natychmiastowe. Problem występuje z linią:Metoda HttpTransportSe.call() trwająca minutę połączenia z serwisem WWW

transport.call(SOAP_ACTION, soapEnvelope); 

To się nazywa i wartość jest zwracana z serwisu internetowego niemal natychmiast. Ale może to potrwać nawet minutę, aby osiągnąć następny wiersz:

SoapObject result = (SoapObject) soapEnvelope.bodyIn; 

co dzieje się między usługą internetową zwracania danych i aplikacji uderzanie następną linię (powyżej)? Czy istnieje sposób na zmniejszenie tego opóźnienia? Czy jest coś łatwego do sprawdzenia?

+0

czy jesteś pewien, że rezultat jest tak szybki? możliwe jest, że serwer utrzymuje połączenie otwarte z jakiegoś powodu. – njzk2

+0

Tak, kiedy idę do witryny usługi sieciowej w przeglądarce internetowej, natychmiast zwraca wyniki. A kiedy zdalnie debuggujemy serwis internetowy, opóźnienie przychodzi od momentu, w którym funkcja zwraca ciąg znaków, aż do wiersza 'SoapObject result = (SoapObject) soapEnvelope.bodyIn;', więc nie ma opóźnień w usłudze internetowej. Wszystkie inne połączenia z serwisem internetowym używają tego samego kodu dla żądań, zmieniając tylko kilka zmiennych i są w porządku. – anothershrubery

Odpowiedz

1

Okazuje opóźnienie tylko podczas debugowania aplikacji. Po uruchomieniu aplikacji bez załączonego debugera, następuje powrót w pobliże instancji.

1

Czy istnieje sposób na zmniejszenie tego opóźnienia? Czy jest coś łatwego do sprawdzenia?

Jedynym sposobem na poznanie jest zmierzenie różnicy czasu w różnych obszarach. W przypadku wywołania usługi internetowej SOAP są to czasy pomiaru.

czas po stronie klienta

Kod aplikacji Client -> Zapytaj teleskopowe -> Zapytanie serializacji -> Zapytanie wysyłkowy -> HTTP Transport -> Po stronie serwera

czas po stronie serwera

Otrzymuj HTTP Żądanie -> Odtworzenie serializacji -> Kod aplikacji -> Procedury obsługi odpowiedzi -> Serializacja -> Wysłanie -> Transport HTTP

Zablokowanie zazwyczaj znajduje się w kodzie aplikacji, procedurach obsługi i sieci. Zmierz je i znajdź czas, w którym spędzasz czas.

  • Aby zmierzyć czas procesora pobrany przez kod aplikacji i procedury obsługi, należy użyć profilera . Polecam Jprofiler.
  • Aby zmierzyć czas sieci, wykonaj polecenie ping do serwera docelowego, a także użyj proxy debugowania internetowego, na przykład Charles. Pozwala określić czas spędzony przez żądanie w sieci.
+0

Wiem, gdzie jest opóźnienie, znajduje się w bibliotece stron trzecich ksoap2, w szczególności w metodzie 'HttpTransportSE.call()'. Szukam sposobu rozwiązania tego opóźnienia lub sprawdzenia, co dzieje się z tym kodem, który może być przyczyną opóźnienia. – anothershrubery

Powiązane problemy