Android getInputStream () извлекает не все байты, а только время от времени - PullRequest
1 голос
/ 06 мая 2011

Во-первых, у меня есть класс, который расширяет AsyncTask. Затем в методе doInBackground () у меня есть некоторый код, который отправляет сообщение HTTP и получает ответ. Этот ответ читается в строку следующим образом:

DataInputStream dis = new DataInputStream(conn.getInputStream());
byte[] data = new byte[32768];
len = dis.read(data, 0, 32768);

if (len > 0)
{
   response = new String(data, 0, len);
}

На этом этапе ответ должен составлять 4127 байт (что подтверждается сервером). 1/5 времени это 4127 байт. 2/5 времени это 1205 байтов, а 2/5 времени это 3853 байта. Я могу закрыть приложение, переустановить и получить такой же вариант.

Человек, который управляет сервером, регистрирует все и может подтвердить, что одни и те же данные отправляются снова и снова. Но Android не получает полный поток. Это беспроводной, а не 3g. Когда я использую отладчик, я вижу, что возвращаемая строка всегда идентична, просто отрубленная в случайном месте.

Извините за такой расплывчатый (глупый?) Вопрос, но я смотрю на это часами и не вижу, что с ним не так ...

1 Ответ

1 голос
/ 06 мая 2011

Документация метода read гласит: Считывает до байтов данных из содержащегося входного потока в массив байтов.Предпринята попытка прочитать столько же, сколько len байтов, , но меньшее число может быть прочитано , возможно, ноль.Количество фактически прочитанных байтов возвращается как целое число.

В зависимости от различных условий, иногда вы можете прочитать все данные, отправленные сервером, иногда есть краткое чтение.Чтобы получить все данные, вы должны продолжать читать поток в цикле, пока len не станет -1, что означает EOF.

InputStream in = ...;
byte[] dst = new byte[32768]; /* Assuming total len is < 32768 */
int idx = 0;
do {
  int len = in.read(dst, idx, 32768 - idx);
  idx += len;
} while (len >= 0 || idx < 32768);
...