Медленная загрузка файла Android против iOS и BlackBerry - DefaultHttpClient - PullRequest
2 голосов
/ 02 июня 2011

Я использую следующий код для загрузки файлов и обнаруживаю, что производительность действительно очень низкая по сравнению с практически одинаковым кодом на iOS и BlackBerry.

, а также тестирование на различных версиях SDKи OSX против Windows, я также пробовал приложение на различных устройствах - HTC Desire, Samsung Galaxy, Huwei Pulse, HTC Wildfire - все с ужасной производительностью по сравнению с устройствами iPhone и BlackBerry.

Посмотрите это видео, которое я сделалсравнить скорости на 3 эмуляторах: Android против iOS и BlackBerry

Вот код Android:

FileOutputStream fos = null;
InputStream input = null;

try {   
fos = new FileOutputStream("XXXX");

        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("XXXX");
        HttpResponse response = httpclient.execute(httpget);
        input = response.getEntity().getContent();    

byte[] buffer = new byte[8192];
int readBytes;
while (((readBytes = input.read(buffer, 0, buffer.length)) != -1)
&& !thePackage.getPackageStatus().equals(
PackageStatus.STATUS_CANCEL_DOWNLOAD)) {
fos.write(buffer, 0, readBytes);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
}
}

if (input != null) {
try {
input.close();
} catch (IOException e) {
}

    }
}

Я пробовал BufferedHttpEntity и другие буферы/ Threading стратегии, но эта версия кода является лучшей из всех опций, которые мы пробовали.Я запустил обширное профилирование кода и не вижу слишком много времени, потраченного между функциями верхнего уровня и нативным кодом в Dalvik / Apache Harmony.

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

Спасибо,

Ник

Ответы [ 3 ]

2 голосов
/ 02 июня 2011

Документация Android гласит, что FileOutputStream не буферизован и должен быть заключен в BufferedOutputStream.

    OutputStream out = null;
    try {
        out = new BufferedOutputStream(new FileOutputStream("XXXX"));

        // write to out

    } finally {
        if (out != null) {
            out.close();
        }

    }

Дополнительная информация в FileOutputStream

0 голосов
/ 08 января 2012

Существует множество вариантов для подключения. Вы можете попробовать установить некоторые из них самостоятельно.
или
попробуйте использовать AndroidHttpClient

0 голосов
/ 03 июня 2011

Я переписал этот ответ, после личного разговора с Ником (в сентябре 2011 года) он заявил, что на реальном устройстве проблем не было.

Проблема заключается в различиях производительности между эмулятором и реальным оборудованием. Он также проверил, что он не использует дросселирование.

Я никогда не пытался загружать большие файлы с помощью эмулятора, поэтому я не могу комментировать, кроме как сказать, что Ник сейчас счастлив; -)

...