2010-12-15 4 views
2

Я иногда получаю OutOfMemoryError при размещении большого файла на Android. Это код, который я использую. Я делаю что-то неправильно?Публикация большого файла на Android

HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
con.setRequestMethod("POST"); 
con.setDoInput(true); 
con.setDoOutput(true); 
ostream = new DataOutputStream(con.getOutputStream()); 
byte[] buffer = new byte[1536]; 
int count; 
while ((count = fileInput.read(buffer)) != -1) { 
    ostream.write(buffer, 0, count); // This sometimes causes OutOfMemoryError 
} 
ostream.flush(); 

бы вызова ostream.flush() внутри цикла while никакой пользы?

+1

Возможно, вы используете слишком много памяти – Falmarri 2010-12-15 21:22:46

+0

Как я могу использовать меньше, чтобы сделать это? – hpique 2010-12-15 21:24:57

+0

попробуйте уменьшить размер вашего буфера. – Ramp 2010-12-15 21:26:12

ответ

4

Если вы это сделаете, весь POST должен быть буферизирован в память. Это связано с тем, что сначала необходимо отправить заголовок Content-Length.

Вместо этого, я думаю, вы хотите использовать HTTP-библиотеки Apache, включая FileEntity. Это позволит определить длину перед чтением файла. Вы можете использовать this answer в качестве отправной точки. Но второй параметр для конструктора FileEntity должен быть типом mime (например, image/png, text/html и т. Д.).

2

HTTP-соединение в порядке, но HTTPS вызовет ошибку из памяти, поскольку в Android 2.3.4 есть ошибка в HttpsURLConnectionImpl.java, и она исправлена ​​в Android 4.1 (я проверил источник код).

Кстати, ему следует избегать буферизации всех данных POST в ОЗУ, добавив «con.setChunkedStreamingMode (0)»; сразу после «con.setDoOutput (true)»; заявление.

Смежные вопросы