#http #android #java
Пишу свое первое приложение, по этому прошу сильно не ругать...
Возможно ли скачать файл из Интернета без помощи BufferedInputStream?
Проблема вся в том, что при скачивании файла размером до 50мб все в порядке, но если
файл больше, получаю исключение с ошибкой о переполнении кучи.
12-18 18:20:26.846: I/dalvikvm-heap(12319): Forcing collection of SoftReferences
for 58369314-byte allocation__
__12-18 18:20:26.916: E/dalvikvm-heap(12319): Out of memory on a 58369314-byte
allocation.
Ко всему прочему, предел файла меняется в зависимости от устройства.
Код:
@Override
protected Boolean doInBackground(String... params) {
//В этом методе происходит загрузка файла через
//стандартный класс URLConnection
int count;
try {
int i=0;
dataFiles = getResources().getStringArray(R.array.dataFiles);
File path = new File(Environment.getExternalStorageDirectory()+"/testing");
if(!path.exists()){
path.mkdirs();
}
for (String url_string : params) {
URL url = new URL(url_string);
URLConnection conection = url.openConnection();
conection.connect();
int lenghtOfFile = conection.getContentLength();
InputStream input = new BufferedInputStream(url.openStream(),
lenghtOfFile);
OutputStream output = new FileOutputStream(path+"/"+dataFiles[i]);
byte data[] = new byte[256];
long total = 0;
while ((count = input.read(data)) != -1) {
//Проверяем, актуальна ли еще задача
if (isCancelled()){
output.flush();
output.close();
input.close();
return null;
}
total += count;
output.write(data, 0, count);
//Информирование о закачке.
//Передаем число, отражающее процент загрузки файла
//После вызова этого метода автоматически будет вызван
//onProgressUpdate в главном потоке
publishProgress((int)((total*100)/lenghtOfFile));
}
output.flush();
output.close();
input.close();
++i;
}
} catch (Exception e) {
System.out.println("Ошибка: "+e.getMessage());
}
return true;
}
Подскажите, пожалуйста, как все-таки возможно качать большие файлы, без того, чтобы
съесть всю кучу?
Ответы
Ответ 1
Не понятно, зачем вы используете BufferedInputStream при загрузке данных фиксированного размера из сети, и сохранения их сразу в файл, что не имеет никакого смысла, и при этом не оборачиваете FileOutputStream в BufferedOutputStream, что должно значительно снизить тормоза, в случае медленной ФС, и быстрого интернет-соединения. Попробуйте сделать наоборот.Ответ 2
Я когда использовал в своем приложении, то делал наподобие вот этого DOWNLOAD LARGE FILES. Попробуйте этот код, если не выйдет - пишите, придумаем что-то. Сейчас нету возможности проверить код.
Комментариев нет:
Отправить комментарий