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

时间:2011-04-28 20:39:15

标签: android android-asynctask httpurlconnection

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

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

当我第二次到第五次运行时,我得到一个新线程(在DDMS视图中可见),并且在获取输入流时收到500响应代码和IOException。

当我第六次或更多次调用时,没有创建新线程,我仍然得到500响应代码和IOException。

我在这里可以找到什么?它总是工作一次,永远不会再次。有没有人见过这个?我完全难过了。

这是MINIMAL代码(我删除了try / catch,变量声明,app特定的东西等):

   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);

1 个答案:

答案 0 :(得分:1)

这真的感觉就像服务器上的一个问题(代码500几乎普遍用于指示服务器端代码中的某种问题,尽管它可能是Web服务器本身的问题)。

您是否控制服务器代码?您是否可能打开文件而不关闭它,以便其他调用可能会遇到“拒绝访问”或“文件已打开”错误?