我在我的长轮询库SignalA中使用basic-http-client。basic-http-client 基于 HttpUrlConnection。在模拟器中运行时,可以打开一个长时间运行的后请求并同时执行另一个后请求。在真实设备上运行我的代码时,第二个 POST 会挂起,直到第一个 POST 完成。它挂在 getResponseCode 函数上。
在模拟器或真实设备上运行有什么区别?如何启用多个 AND 同时请求?
我在我的长轮询库SignalA中使用basic-http-client。basic-http-client 基于 HttpUrlConnection。在模拟器中运行时,可以打开一个长时间运行的后请求并同时执行另一个后请求。在真实设备上运行我的代码时,第二个 POST 会挂起,直到第一个 POST 完成。它挂在 getResponseCode 函数上。
在模拟器或真实设备上运行有什么区别?如何启用多个 AND 同时请求?
引用此处提出的类似问题的解决方案:-
保持连接处于活动状态时使用的连接池HttpURLConnection
已损坏,因此它会尝试使用已被服务器关闭的连接。默认情况下,Android 在所有连接上设置 KeepAlive。
System.setProperty("http.keepAlive", "false");
是一种为所有连接禁用 KeepAlive 的解决方法,这样您就可以避免连接池中的错误。
conn.setRequestProperty("Connection","Keep-Alive");
为这个特定的连接打开 KeepAlive,本质上是相反的System.setProperty("http.keepAlive", "false");
。
此外,我总是显式调用 connect(),因为它可以清楚地表明您在哪里结束连接设置。我不确定调用这个方法是否是可选的。
System.setProperty("http.keepAlive", "false");
HttpURLConnection conn = (HttpURLConnection) mURL.openConnection();
conn.setUseCaches(false);
conn.setRequestProperty("User-Agent", useragent);
conn.setConnectTimeout(30000);
conn.setDoOutput(true);
conn.setDoInput(true);
consumer.sign(conn);
conn.connect();
InputSource is = new InputSource(conn.getInputStream());