gpt4 book ai didi

android - 使用 Android DefaultHTTPClient 执行 POST 请求会导致 execute() 卡住

转载 作者:行者123 更新时间:2023-11-29 14:09:40 29 4
gpt4 key购买 nike

我需要将数据发布到服务器。我使用这段代码:

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 的配置上。

最佳答案

我成功地使用了 POST HTTP 请求。这是我的代码。我删除了使用处理程序显示消息等的 fragment 以及处理程序本身。POST 字符串类似于“&NAME=value@NAME2=value2”...

protected class ConnectingThread implements Runnable
{
Message msg;
private Handler mExtHandler;
private String mData;
private String mUrl;

/**
* @param h (Handler) - a handler for messages from this thread
* @param data (String) - data to be send in HTTP request's POST
* @param url (String) - URL to which to connect
*/
ConnectingThread(Handler h, String data, String url) {
mExtHandler = h;
mData = data;
mUrl = url;
}

public void run() {
try {
// TODO use the handler to display txt info about connection

URL url = new URL(mUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(CONN_TIMEOUT_MILLIS);

conn.setDoOutput(true);
BufferedOutputStream wr = new BufferedOutputStream(conn.getOutputStream());
wr.write(mData.getBytes());
wr.flush();
wr.close();

String sReturn = null;

BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
int length = conn.getContentLength();
char[] buffer = new char[length];
int read = rd.read(buffer);
if(read == length)
sReturn = new String(buffer);
rd.close();
buffer = null;
// TODO use the handler to use the response

} catch (Exception e) {
//....
}
// TODO use the handler to display txt info about connection ERROR
}

}

关于android - 使用 Android DefaultHTTPClient 执行 POST 请求会导致 execute() 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4321951/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com