【发布时间】:2016-04-02 05:57:51
【问题描述】:
我需要将数据发布到服务器。 我使用此代码:
HttpClient client = new DefaultHttpClient();
try {
HttpPost httppost = new HttpPost(serverUrl);
StringEntity se = new StringEntity(data);
httppost.setEntity(se);
httppost.setHeader("Accept", "application/json");
httppost.setHeader("Content-type", "application/json");
// Execute HTTP Post Request
HttpResponse response = client.execute(httppost);
int statusCode = response.getStatusLine().getStatusCode();
Log.i(TVProgram.TAG, "ErrorHandler post status code: " + statusCode);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (client != null) {
client.getConnectionManager().shutdown();
}
}
但问题是 Android 在 execute() 方法上冻结,应用程序被阻止,一段时间后 Android 告诉我应用程序没有响应。
我尝试调试 SDK 类,但它冻结在第 103 行的 AbstractSessionInputBuffer 类中
l = this.instream.read(this.buffer, off, len);
我也试过在单独的线程中运行请求,但同样的问题。
我在 Android 2.1(模拟器)和 Android 2.2 真实移动设备上对其进行了测试。
我还尝试设置 HTTP 代理并使用 Fiddler 来检查服务器接收到的 HTTP 通信数据,服务器也发送正确的答案和 HTTP 代码 200。一切似乎都很好。
请问有什么问题吗?
更新:当我使用作为 Android 2.2 SDK 一部分的 AndroidHttpClient 时,它运行良好。但它不在早期版本的 Android 中。所以我现在将它的源代码包含在我的应用程序中。但是AndroidHttpClient内部使用的是DefaultHTTPClient,所以问题出在DefaultHttpClient的配置上。
【问题讨论】:
-
我在这里遇到了与 Android 4+ 相同的问题。从 AsyncTask 启动的 AndroidHttpClient 在发出 POST 请求时永远不会从 execute() 返回。为了让它永远阻塞,我有以下请求序列:POST(500),GET(200),POST(永不结束)
-
貌似是没有关闭HttpEntity的问题:stackoverflow.com/a/14088063
标签: android