Android AsyncTask和HTTP post只能工作一次?

Android AsyncTask和HTTP post只能工作一次?,android,android-asynctask,httpurlconnection,Android,Android Asynctask,Httpurlconnection,我的应用程序中有一个创建HttpURLConnection的AsyncTask。接下来,它调用getOutputStream(),写入一些字节,刷新并关闭。然后调用getResponseCode()和getInputStream()。如果我需要发布代码,我可以,但我想我会保持小问题 当我第一次运行它时,我得到了一个200响应代码,并且得到了正确的输入流 当我第二次到第五次运行它时,我会得到一个新线程(可以在DDMS视图中查看),我会收到一个500响应代码,在获取输入流时会收到一个IOExcept

我的应用程序中有一个创建HttpURLConnection的AsyncTask。接下来,它调用getOutputStream(),写入一些字节,刷新并关闭。然后调用getResponseCode()和getInputStream()。如果我需要发布代码,我可以,但我想我会保持小问题

当我第一次运行它时,我得到了一个200响应代码,并且得到了正确的输入流

当我第二次到第五次运行它时,我会得到一个新线程(可以在DDMS视图中查看),我会收到一个500响应代码,在获取输入流时会收到一个IOException

当我第六次或更多次调用它时,不会创建新线程,并且仍然会得到500响应代码和IOException

我能在这里找什么?它总是工作一次,再也不会工作了。还有谁见过这个吗?我完全被难住了

以下是最简单的代码(我删除了try/catch、变量声明、特定于应用程序的内容等):


这确实感觉像是服务器上的问题(代码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);