В моем приложении есть 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);