Android AsyncTask和HTTP post只能工作一次?
我的应用程序中有一个创建HttpURLConnection的AsyncTask。接下来,它调用getOutputStream(),写入一些字节,刷新并关闭。然后调用getResponseCode()和getInputStream()。如果我需要发布代码,我可以,但我想我会保持小问题 当我第一次运行它时,我得到了一个200响应代码,并且得到了正确的输入流 当我第二次到第五次运行它时,我会得到一个新线程(可以在DDMS视图中查看),我会收到一个500响应代码,在获取输入流时会收到一个IOException 当我第六次或更多次调用它时,不会创建新线程,并且仍然会得到500响应代码和IOException 我能在这里找什么?它总是工作一次,再也不会工作了。还有谁见过这个吗?我完全被难住了 以下是最简单的代码(我删除了try/catch、变量声明、特定于应用程序的内容等):Android AsyncTask和HTTP post只能工作一次?,android,android-asynctask,httpurlconnection,Android,Android Asynctask,Httpurlconnection,我的应用程序中有一个创建HttpURLConnection的AsyncTask。接下来,它调用getOutputStream(),写入一些字节,刷新并关闭。然后调用getResponseCode()和getInputStream()。如果我需要发布代码,我可以,但我想我会保持小问题 当我第一次运行它时,我得到了一个200响应代码,并且得到了正确的输入流 当我第二次到第五次运行它时,我会得到一个新线程(可以在DDMS视图中查看),我会收到一个500响应代码,在获取输入流时会收到一个IOExcept
这确实感觉像是服务器上的问题(代码500几乎普遍用于表示服务器端代码中的某种问题,尽管它可能是web服务器本身的问题)
你控制服务器代码吗?您是否可能打开一个文件而不关闭它,因此其他调用可能会遇到“访问被拒绝”或“文件已打开”错误?这确实感觉像是服务器上的问题(代码500几乎普遍用于指示服务器端代码中的某种问题,尽管它可能是web服务器本身的问题)
你控制服务器代码吗?您是否可能正在打开一个文件而没有关闭它,因此其他调用可能会遇到“拒绝访问”或“文件已打开”错误?请完成最少的代码。请尝试每次都不要在流上调用close()。我不确定这会产生什么后果,所以我不会提供答案,但这正是我过去在与服务器多次通信时遇到的问题。我发布了最少的代码。我删除了try/catch块、变量声明和特定于应用程序的处理,如如何处理响应等。除此之外,如果您在这里没有看到应该看到的内容,那么我将丢失它!您可以发布调用AsyncTask的execute()方法的部分的代码吗?你是如何多次调用它的?你在使用什么URI?使用不同的URI时是否会出现相同的错误,例如?请完成最少的代码。请不要每次都在流上调用close()。我不确定这会产生什么后果,所以我不会提供答案,但这正是我过去在与服务器多次通信时遇到的问题。我发布了最少的代码。我删除了try/catch块、变量声明和特定于应用程序的处理,如如何处理响应等。除此之外,如果您在这里没有看到应该看到的内容,那么我将丢失它!您可以发布调用AsyncTask的execute()方法的部分的代码吗?你是如何多次调用它的?你在使用什么URI?当使用不同的URI时,是否会出现相同的错误,例如?另一个同事控制服务器端。他能够使用XMLSpy(从Eclipse调试器中提取)发布我的确切消息。我将与他确认,他可以张贴在一个连续多次。这应该可以消除服务器端的问题。我用XMLSpy发布了两次相同的soap消息,第二次失败了。这证明这不是我的密码。我们必须调查服务器。谢谢你的回复。我应该想试试,另一个同事控制服务器端。他能够使用XMLSpy(从Eclipse调试器中提取)发布我的确切消息。我将与他确认,他可以张贴在一个连续多次。这应该可以消除服务器端的问题。我用XMLSpy发布了两次相同的soap消息,第二次失败了。这证明这不是我的密码。我们必须调查服务器。谢谢你的回复。我本该想试试的。
protected String doInBackground(String... params)
{
connectURL = new URL(sWebPath);
conn = (HttpURLConnection)connectURL.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setConnectTimeout(10000);
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent", "MyAppAgent");
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
// Setup my post as a string s.
conn.setRequestProperty("Content-Length", String.valueOf(s.length()));
conn.connect();
DataOutputStream dataStream = new DataOutputStream(conn.getOutputStream());
dataStream.writeBytes(s);
dataStream.flush();
dataStream.close();
dataStream = null;
// 200 1st time only, 500 after that.
responseCode = conn.getResponseCode();
// Works 1st time only, IO error after that
DataInputStream dis = new DataInputStream(conn.getInputStream());
byte[] data = new byte[16384];
int len = dis.read(data, 0, 16384);
dis.close();
conn.disconnect();
response = new String(data, 0, len);
// do whatever with my response
}
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
// Now I call a Toast message on the original context used to
// create this AsyncTask.
}
// The onClickListener of a button calls this AsyncTask (TierRequest class) with only two lines
TierRequest t = new TierRequest(WhateverMyCurrentActivityIs.this);
t.execute(A_Constant_Indicating_The_Type_Of_Post);