SocketException при загрузке zip файла большого размера

Я загружаю zip файл большого размера с сервера. Я следую за

06-11 21:45:18.789: I/System.out(8993): java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out)

Мое приложение не останавливается, но моя загрузка останавливается. Это происходит на мобильных устройствах hdpi android, которые говорят о низких процессорных устройствах. Загрузка работает отлично на S3 и планшетах. Я использую простой метод FileOutputStream для загрузки файла.

Ответ 1

Если вы используете HttpConnection, увеличьте время ожидания

HttpURLConnection con = (HttpURLConnection) url.openConnection();

con.setReadTimeout(10000);

ИЛИ

HttpConnectionParams.setSoTimeout(httpParameters, 10000);//

Ответ 2

Думаю, вам нужно приобрести WakeLock, чтобы закончить загрузку, а затем отпустите его. Особенно, если вы загружаете большой файл через Wi-Fi-соединение, типично приобретать WifiLock, чтобы не пропускать радио.

С другой стороны, вы можете (если вы этого еще не сделали), а также попробовать DownloadManager. Поскольку эта официальная статья о wakelocks,

"Если ваше приложение выполняет длительные загрузки HTTP, рассмотрите возможность использования DownloadManager".

Ответ 3

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

Мое предложение пытается реализовать ограничитель скорости полосы пропускания. Таким образом, вы можете проверить, будут ли медленные устройства лучше реагировать на эти длительные загрузки, хотя они будут медленнее.

Ответ 4

Ниже вам могут быть полезны ссылки

Android скачать большие файлы

Android - остановка больших файлов - использование async/progressdialog

попробуйте loopj lib скачать файл асинхронно http://loopj.com/android-async-http/ Я не уверен в том, что loopj lib загружает большой файл, но вы можете сделать это через пробную версию и ошибку.

Ответ 5

Чтобы работать с сервером HTTP, я настоятельно рекомендую вам Loopj, это надежная, простая и простая в использовании библиотека, как говорится в документации, вы можете скачать файл просто так:

AsyncHttpClient client = new AsyncHttpClient();
String[] allowedContentTypes = new String[] { "image/png", "image/jpeg" };
client.get("http://example.com/file.png", new BinaryHttpResponseHandler(allowedContentTypes) {
    @Override
    public void onSuccess(byte[] fileData) {
        // Do something with the file
    }
});