Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

Как закачать с HTTP большой файл?

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

Комментариев нет:

Отправить комментарий