Android AsyncTask и сообщение HTTP - работает только один раз?

У меня есть AsyncTask в моем приложении, которое создает HttpURLConnection. Затем он вызывает getOutputStream(), записывает несколько байтов, сбрасывает и закрывает. Затем он вызывает getResponseCode() и getInputStream(). Если мне нужно опубликовать код, я могу, но решил оставить вопрос небольшим.

Когда я запускаю это в первый раз, я получаю код ответа 200 и правильный входной поток.

Когда я запускаю это со второго по пятый раз, я получаю новый поток (видимый в представлении DDMS), и я получаю код ответа 500 и исключение IOException при получении входного потока.

Когда я вызываю это в шестой или более раз, новые потоки не создаются, и я все равно получаю код ответа 500 и исключение IOException.

Что я могу здесь искать? Это всегда работает один раз и никогда больше. Кто-нибудь еще видел это? Я совершенно озадачен.

Вот МИНИМАЛЬНЫЙ код (я удалил try/catch, объявления переменных, специфичные для приложения вещи и т. д.):

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

person Paul    schedule 28.04.2011    source источник
comment
Полный минимальный код, пожалуйста.   -  person Thane Anthem    schedule 29.04.2011
comment
Старайтесь не вызывать close() в потоке каждый раз. Не уверен, какие последствия это имеет, поэтому я не буду предоставлять это в качестве ответа, но это то, что сработало для меня в прошлом, когда у меня несколько раз возникали проблемы со связью с сервером.   -  person LeffelMania    schedule 29.04.2011
comment
Я разместил минимальный код. Я удалил блоки try/catch, объявления переменных и специфичную для приложения обработку, например, что делать с ответом и т. д. Помимо этого, если вы не видите здесь чего-то, что должно быть, значит, я что-то упускаю!   -  person Paul    schedule 29.04.2011
comment
Можете ли вы опубликовать код для той части, где вы вызываете метод execute() AsyncTask? Как вы называете это несколько раз?   -  person advantej    schedule 29.04.2011
comment
Какой URI вы нажимаете? Вы получаете ту же ошибку при использовании другого URI, например google.com?   -  person Thane Anthem    schedule 29.04.2011
comment
advantej — код для вызова AsyncTask очень прост. Я разместил это выше. Thane — это внутренний сервер, который возвращает данные обратно. Я не уверен, где еще я мог бы опубликовать сообщение SOAP. Какой адрес Google я могу попробовать?   -  person Paul    schedule 29.04.2011


Ответы (1)


Это действительно похоже на проблему на сервере (код 500 почти повсеместно используется для обозначения какой-то проблемы в коде на стороне сервера, хотя это может быть проблема с самим веб-сервером).

Вы контролируете код сервера? Возможно, вы открываете файл и не закрываете его, так что дополнительные вызовы могут привести к ошибкам «отказано в доступе» или «файл уже открыт»?

person Mike Marshall    schedule 28.04.2011
comment
Другой сотрудник контролирует серверную часть. Он может опубликовать мое точное сообщение с помощью XMLSpy (извлеченного из отладчика Eclipse). Я уточню у него, что он может публиковать несколько раз подряд. Это должно устранить серверную часть в этом. - person Paul; 29.04.2011
comment
Я дважды отправил одно и то же мыльное сообщение с помощью XMLSpy, и во второй раз это не удалось. Это подтверждает, что это не мой код. Нам придется исследовать сервер. Спасибо за все ответы. Я должен был подумать, чтобы попробовать это. - person Paul; 29.04.2011