2011-01-16 4 views
2

Ich versuche, eine lange Polling Push-Service auf meiner Android-Anwendung zu implementieren (basierend auf Microsofts AUTD ActiveSync ->http://technet.microsoft.com/en-us/library/aa997252.aspx).Android https lange Polling: Kann keine Antwort erhalten, wenn Polling-Intervall länger als 70 Sekunden ist

Ich habe bereits den Server Teil mit Servlets 3.0 auf Tomcat 7.0 realisiert. Ich habe meine AsyncServlets mit CURL getestet, alles funktioniert einwandfrei.

Das ist, wie ich meine AsyncServlet getestet:

curl "https://webservice.mydomain.net/push?id=1&heartbeat=180000" --insecure --user user:password -D - 

Server-Antwort nach 3 Minuten (Taktintervall)

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Pragma: No-cache 
Cache-Control: no-cache 
Expires: Thu, 01 Jan 1970 01:00:00 CET 
Content-Type: application/json;charset=ISO-8859-1 
Content-Length: 0 
Date: Sat, 15 Jan 2011 23:38:57 GMT 

auf meinem Android-Anwendung habe ich folgenden Code:

HttpParams httpParams = mDefaultHttpClient.getParams(); 
HttpConnectionParams.setConnectionTimeout(httpParams, CONNECTION_TIMEOUT); 
HttpConnectionParams.setSoTimeout(httpParams, mHeartbeat + TIMEOUT_TOLERANCE); 
mDefaultHttpClient.setParams(httpParams); 

HttpGet httpGet = new HttpGet(mPushURL); 
httpGet.addHeader("Accept", "application/json"); 

try { 
    Log.i(TAG, "Executing GET(PUSH) request " + httpGet.getRequestLine()); 
    HttpResponse httpResponse = mDefaultHttpClient.execute(httpGet); 
    Log.i(TAG, httpResponse.getStatusLine().toString()); 
    Log.i(TAG, convertInputStream(httpResponse.getEntity().getContent())); //For testing purposes 
} catch (ClientProtocolException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Ich habe mehrere Tests durchgeführt. Wenn ich ein Herzschlagintervall von 70 Sekunden verwende, erhalte ich die Antwort. Wenn ich ein Heartbeat-Intervall> 70 Sekunden verwende, erhalte ich (nach dem angegebenen Heartbeat-Intervall) eine SocketTimeoutException anstelle meiner HTTP 200 OK Response. (Zur Verdeutlichung: Mein Set SocketTimeout (SoTimeout) funktioniert korrekt, aber vielleicht ist die Verbindung verloren, ich habe keine Ahnung warum).

Danke für jede Antwort.

Antwort

1

Verwenden URLConnection und setzen Readtimeout. Kaufen Sie es ist schwer zu sagen. Ich denke, Androiden-Netzwerk-Schicht friert offene Verbindungen ein. (Ich arbeite an ähnlichen Projekt. Konnte nicht finden, warum offene Verbindungen einfrieren)

1

Versuchen mit dem Hinzufügen:

ConnManagerParams.setTimeout(params, CONNECTION_TIMEOUT); 
Verwandte Themen