Android медленная загрузка файлов - PullRequest
3 голосов
/ 29 января 2011

Я загружаю на мое приложение для Android.Я использую подключение к локальной сети, и загрузка действительно медленная.

Вот код, который я использую:

URL url = new URL(ep.getFileURL());
File destFile = new File(<path to sd card file>);

URLConnection uCon = url.openConnection();
InputStream is = uCon.getInputStream();
OutputStream os = new FileOutputStream(destFile);

int progress = 0;
int lastProgress = 0;
int totalSize = uCon.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[4096];
int count = -1;
while((count = is.read(buffer)) != -1)
{
    os.write(buffer, 0, count);

downloadedSize = downloadedSize + count;
    progress = (int)(downloadedSize * 100.0 / totalSize);
    if(progress - lastProgress >= 5) {
        publishProgress(progress);
        lastProgress = progress;
    }
}

os.close();

Вы обнаружите какие-либо проблемы?спасибо.

Редактировать:

Я проверил свой код, используя ваши предложения, и получил следующие результаты:

# Download times tests #

Without bufferedoutput
Downloading file:      1 ms, Start download
Downloading file:      179812 ms, Finished downloading 54687744 bytes
Downloading file: end, 179813 ms

With bufferedoutput
Downloading file:      1 ms, Start download
Downloading file:      178312 ms, Finished downloading 54687744 bytes
Downloading file: end, 178313 ms

With httpclient
Downloading file: begin
Downloading file:      1 ms, Start download
Downloading file:      178241 ms, Finished downloading 54687744 bytes
Downloading file: end, 178242 ms

Итак, используя буферизованные потокиили использование HttpClient напрямую, ничего не меняет ...

Я также должен был упомянуть, что мой код находится внутри AsyncTask, поэтому publishProgress () фактически уже выполняется в отдельном потоке ...

Спасибо за вашу помощь.

Ответы [ 2 ]

4 голосов
/ 29 января 2011

Вы должны обернуть ваш входной поток в BufferedInputStream. Вы, вероятно, получаете намного более мелкие чтения нескольких байтов, и буферизованный поток облегчит некоторые из них. Сначала я попробую это сделать, буферизуя как входной, так и выходной потоки, чтобы уменьшить задержки записи на уровне ОС.

Во-вторых, я буду осторожен с тем, как вы публикуете прогресс. Похоже, вы ограничиваете количество раз, когда он запускается, но вы можете захотеть переместить загрузку в свой собственный исполняемый файл и использовать для загрузки сервис-исполнитель и, возможно, запустить дополнительный поток, который оценивает ход всех загрузок и запускает процесс сообщения по мере необходимости.

2 голосов
/ 29 января 2011

Используйте HttpClient вместо URLConnection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...