我在Android上遇到HttpClient这个奇怪的问题。如果我尝试使用WiFi连接到https网址,我会在发送实际请求之前有延迟。如果我通过3G发送请求,则延迟不存在。
然而,它只发生在Android 2.2和2.3上,如果我在例如2.1-update1上运行它也可以在wifi上运行。
但是,在初始请求之后立即发送请求时 - 它也可以在Wifi上正常工作 - 但只有一段时间。然后它回到10秒,一个,然后再适当一段时间......
在2.3上运行时: 11285 ms
在1.6上: 617毫秒
我用来尝试解决这个问题的代码是这样的 HttpManager和:
public class Main extends Activity {
Button button;
TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
doRequest();
}
});
}
private void doRequest() {
HttpGet httpget = new HttpGet("https://url_goes_here/");
HttpResponse httpResponse = null;
try {
ResponseHandler<String> responseHandler = new BasicResponseHandler();
long before = System.currentTimeMillis();
httpResponse = HttpManager.execute(httpget);
long after = System.currentTimeMillis();
HttpEntity entity = httpResponse.getEntity();
String response = convertStreamToString(entity.getContent());
Log.i("Test", response);
TextView text = (TextView) findViewById(R.id.text);
text.setText((String) "Time: " + (after-before) + "\n" + response);
} catch (Exception e) {
e.printStackTrace();
// Simplified code a bit
}
}
protected static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
发生延迟的行是HttpManager.execute(httpget);这也是我计算ms的行。
有没有人遇到过这个问题?我发现这种延迟非常烦人,我的用户也是如此。仿真器的运行方式与运行2.1-update1的Xperia Mini Pro的运行方式相同,它可以通过Wifi正常工作,而运行CyanogenMod 7(2.3)的HTC Desire则无法正常工作。
答案 0 :(得分:1)
android附带的ssl堆栈存在问题。我也在努力解决这个问题。转到apache home,获取org.apache.http java包(我使用的是v4.1)。在您的应用程序中包含它并直接使用HttpClient,而不是使用Android内置的HttpClient,您的SSL握手延迟问题将得到解决。
答案 1 :(得分:0)
禁用路由器上的DNS中继!它对我有用!
此外,没有版本的httpclient或httpcore为我改变了它。