Вы должны подтвердить, в какой момент происходит ваша ошибка.Я подозреваю, что это во время чтения ответа.В этом случае кажется, что сервер может отвечать большим количеством данных, которые вы помещаете в StringBuffer
.Вам действительно нужно потреблять весь ответ и хранить его в памяти?Если это файл, сохраните его, а не храните в памяти.
Я провел еще несколько исследований, и вот еще одна возможность.Android JVM по умолчанию имеет максимальную кучу 16 МБ.См. this для некоторых деталей.
С другой стороны, если ваш сервер фактически не использует данные, большая их часть будет находиться на клиенте.Так что, если у вас больше, чем максимальная куча данных, клиент потерпит неудачу.
Так что я подозреваю, что ваш сервер просто не читает данные из потока.
Следующий класс (который представляет собой фрагмент соответствующих частей вашего кода) иллюстрирует проблему.Запустите его на любой JVM, как показано ниже:
java -Xmx16m -cp . Test
, и он очень быстро выдаст OOM.На самом деле, гораздо раньше, чем ожидалось.
import java.io.*;
import java.net.*;
public class Test {
public static void main(String argv[]) throws Exception {
new Thread() {
public void run() {
try {
new ServerSocket(12000).accept();
} catch (Throwable t) {
t.printStackTrace();
}
}
}.start();
URL url = new URL("http://localhost:12000/");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
DataOutputStream ds = new DataOutputStream(con.getOutputStream());
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
for (int i=0;i<100000;i++) {
ds.write(buffer, 0, 1024);
System.out.println("Written chunk " + i);
}
ds.flush();
}
}