#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. Попробуйте этот код, если не выйдет - пишите, придумаем что-то. Сейчас нету возможности проверить код.
Комментариев нет:
Отправить комментарий