I'm trying to download large file from Internet (>20Mb)
private class DownloadTask extends AsyncTask<DatabaseInfo, Integer, String> {
private DatabaseInfo info;
protected String doInBackground(DatabaseInfo... dbInfo) {
int count;
info = dbInfo[0];
try {
URL url = new URL(dbInfo[0].dbPath);
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/db.zip");
byte data[] = new byte[1024];
int total = 0;
while ((count = input.read(data)) != -1) {
//output.write(data, 0, count);
total += count;
if (total % 10240 == 0) {
publishProgress(total);
}
}
output.flush();
output.close();
input.close();
}
catch (Exception e) {
Log.e("err", e.getMessage());
}
return null;
}
protected void onProgressUpdate(Integer... total) {
int perc = (int) ((float) total[0] / (float) info.dbZipSize * 100);
mProgressDialog.setProgress(perc);
}
protected void onPostExecute(String s) {
dismissDialog(DIALOG_PROGRESS);
Log.e("err", "finish!");
}
}
If I uncomment line
//output.write(data, 0, count);
after 7-15% downloading progressbar dialog dismiss and I see "finish!" in Log. Why?
Please make sure that your storage location is saved as an SD card in the settings in our app. If you want to download files larger than 4GB, please change the storage location to internal storage or please transfer after dividing files smaller than 4GB. Then you will be able to download them.
You need to format your sd card using a filesystem that has a larger per-file size limit. NTFS is suggested in another answer but Android does not natively support it. You could try exfat format which is supported by both Windows and Android, so there won't be problems mounting your sdcard on your PC.
To solve the issue you need to go to the setting menu and Downloads app where you can find the setting for data limit. Tap the setting options and you will set mobile data limit to different levels. Actually the software by default set the limit on file size to download over mobile data.
You should look at implementing HTTP Ranges. This will allow you to re-start your download when it fails.
As to why it stops, some carriers implement download limits which will drop a connection after a certain time or download amount. I've seen this first hand on one UK carrier and been told about it on others. It's usually easy to verify the limit by trying to download the file via Androids browser and if you see it stall or stop you know it's most likely a carrier issue (and yes, the download can be terminated without throwing an Exception).
An Http Range implementation will allow you to continue the download from where it left off and thus your doInBackground method to use a hold-off and resume algorithm so that every time the connection is interrupted you wait for an amount of time then try to resume where the download left off (and, of course, implement a retry limit so you don't end up with an infinite loop when the phone really can't download the file).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With