当我的活动加载时,我正在连接到Web服务。当我从服务中得到响应时,我再次呼叫服务等等。
@Override
protected void onCreate(Bundle savedInstanceState) {
….
callWebMethod();
}
// Called on getting response
@Override
public void run(String value) {
….
callWebMethod();
}
这就是我连接服务的方式
HttpGet request = new HttpGet(url + combinedParams);
HttpClient client = new DefaultHttpClient(httpParameters);
HttpResponse httpResponse;
httpResponse = client.execute(request);
responseCode = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
response = StringUtils.remove(response, "\n");
response = StringUtils.remove(response, '"');
}
我是否有可能在开始时只连接一次服务,然后连接保持打开状态,应用程序继续从服务中读取数据,直到强制关闭连接为止。
如果需要更多代码,请告诉我。
更新:然后我尝试使用ClientConnectionManager,但仍然连接一次又一次初始化。虽然它正在获取数据。我想要的是连接保持打开状态,并继续从服务中读取数据。
HttpParams httpParameters = new BasicHttpParams();
SharedPreferences preferences = context.getSharedPreferences(
"MyPreferences", Context.MODE_PRIVATE);
int timeoutConnection = Integer.parseInt(preferences.getString(
"timeout", "60")) * 1000;
HttpConnectionParams.setConnectionTimeout(httpParameters,
timeoutConnection);
HttpConnectionParams.setSoTimeout(httpParameters, 2000);
System.setProperty("http.keepAlive", "true");
HttpClient client = new DefaultHttpClient(httpParameters);
ClientConnectionManager mgr = client.getConnectionManager();
client = new DefaultHttpClient(new ThreadSafeClientConnManager(
client.getParams(), mgr.getSchemeRegistry()),
client.getParams());
while (true) {
HttpResponse httpResponse;
try {
httpResponse = client.execute(request);
responseCode = httpResponse.getStatusLine().getStatusCode();
message = httpResponse.getStatusLine().getReasonPhrase();
HttpEntity entity = httpResponse.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
response = StringUtils.remove(response, "\n");
response = StringUtils.remove(response, '"');
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
callback.run(response); // This calls activity callback function.
}
});
// Closing the input stream will trigger connection release
// instream.close();
}
} catch (ConnectTimeoutException e) {
….
}
答案 0 :(得分:13)
听起来你真正需要的是套接字连接(见here)。套接字将保持连接状态,允许您使用套接字服务器来回传输数据,直到完成为止。
答案 1 :(得分:2)
在完成使用/阅读后,您只需关闭InputStream
HttpResponse.getEntity().getContent()
。这将正式表明您当前请求的结束。
然后您可以继续执行另一个请求,将使用相同的HttpClient连接。
添加关闭
InputStream instream = entity.getContent();
response = convertStreamToString(instream);
// close the InputSream
instream.close()
// you can now reuse the same `HttpClient` and execute another request
// using same connection
httpResponse = client.execute(request);
答案 2 :(得分:2)
我是否有可能在开始时只连接一次服务, 然后连接仍然打开......
Web服务器可以在此处发挥作用。如果服务器"结束"在HTTP响应中,没有进一步的通信将在同一个HTTP调用上发生。
在服务器的帮助下,可以保持HTTP连接打开。在这种情况下,服务器永远不会真正结束响应,但会在一段时间间隔后继续将数据写入响应流,因此客户端可以继续监听。
上述技术的新替代品是双工插座连接。客户端和服务器都可以通过套接字发送和接收消息。同样,客户端和服务器都必须正确支持它,并且必须处理连接丢弃等必要的处理。
有一些特定于Android的客户端实现,如https://github.com/nkzawa/socket.io-client.java,可以为您处理大部分连接管理。
答案 3 :(得分:2)
我认为您可以尝试使用AsyncTask
类来尝试保持线程打开并执行您想要的操作,如下所示:
public class ConnectToWebService extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) { ... }
@Override
protected void onPostExecute(final Boolean success) { ... }
@Override
protected void onCancelled() { ... }
}
检查the API documentation以获取更多信息;)