Android AsyncTask и HTTP post - Работает только один раз? - PullRequest
1 голос
/ 29 апреля 2011

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

1 Ответ

1 голос
/ 29 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...