[android-developers] Download large file from network to SD card
I'm trying to download a large .zip file from a web server but I have a weird behaviour, the description is: - I'm executing the code in the device emulator, API level 3 (version 1.5) with an SD card of 512MB. I start the device with Wipe data user - The length of the size from conexion.getContentLength() is 7012725 - The server address is localhost (10.0.2.2), but I've tried with an external server and the behaviour is the same. I've double checked that I can download the file through a web browser. - I have these permisions in the manifest file: uses-permission android:name=android.permission.INTERNET/uses- permission uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE/uses- permission The error: - It starts downloading the file, I can see the text 10, 20, 30, 40, 50 and then it stops at 60. - After a while, the emulator reboots itself. Workarounds: - About the possible wifi lock, what I've done is add this permission android.permission.WAKE_LOCK and then this piece of code, but with exactly the same behaviour: WifiManager.WifiLock wifilock; WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifilock = manager.createWifiLock(wifilock); wifilock.acquire(); ... wifilock.release(); Here is the code, that it's being executing in a separate thread: private void downloadData(){ try{ Log.v(TAG, downloading data); URL url = new URL(http://10.0.2.2/1.zip;); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); Log.v(TAG, lenghtOfFile = +lenghtOfFile); InputStream is = url.openStream(); File testDirectory = new File(Environment.getExternalStorageDirectory()+/testDirectory/); if(!testDirectory.exists()){ testDirectory.mkdir(); } FileOutputStream fos = new FileOutputStream(testDirectory+/ files.zip); byte data[] = new byte[1024]; int count = 0; long total = 0; int progress = 0; while ((count=is.read(data)) != -1) { total += count; int progress_temp = (int)total*100/lenghtOfFile; if(progress_temp%10 == 0 progress != progress_temp){ progress = progress_temp; Log.v(TAG, total = +progress); } fos.write(data, 0, count); } is.close(); fos.close(); Log.v(TAG, downloading finished); }catch(Exception e){ Log.v(TAG, exception in downloadData); e.printStackTrace(); } } ** more log description:** 00:00 It starts downloading: V/iPhoto ( 853): downloading data V/iPhoto ( 853): lenghtOfFile = 7732809 V/iPhoto ( 853): total = 10 V/iPhoto ( 853): total = 20 V/iPhoto ( 853): total = 30 V/iPhoto ( 853): total = 40 V/iPhoto ( 853): total = 50 (round 00:05) - Here it stops and the DDMS disconnects the device immediatly 03:40 It finish the download (not always) and the device reboots on its own: I/Process ( 595): Sending signal. PID: 595 SIG: 3 I/dalvikvm( 595): threadid=7: reacting to signal 3 D/dalvikvm( 722): GC freed 2193 objects / 135808 bytes in 176 sec V/iPhoto ( 853): total = 60 I/dalvikvm( 595): Wrote stack trace to '/data/anr/traces.txt' I/ActivityManager( 595): Process com.google.android.apps.maps:FriendService (pid 778) has died. I/ActivityManager( 595): Process com.android.mms (pid 732) has died. V/iPhoto ( 853): total = 70 V/iPhoto ( 853): total = 80 V/iPhoto ( 853): total = 90 V/iPhoto ( 853): total = 100 V/iPhoto ( 853): downloading finished V/iPhoto ( 853): thread finish loading I/Process ( 595): Sending signal. PID: 595 SIG: 9 I/ActivityThread( 757): Removing dead content provider: settings I/ActivityThread( 748): Removing dead content provider: settings I/ActivityThread( 722): Removing dead content provider: settings I/ActivityThread( 700): Removing dead content provider: settings I/ServiceManager( 549): service 'package' died ... services dieing... I/ServiceManager( 549): service 'wifi' died E/installd( 557): eof E/installd( 557): failed to read size I/installd( 557): closing connection D/qemud ( 560): fdhandler_event: disconnect on fd 11
Re: [android-developers] Download large file from network to SD card
Hi, Are you doing this from the UI thread? I think you do. If so, you need to move your networking code to a worker thread. Two easy ways to do this are: AsyncTask and IntentService (and Mark Murphy's enhanced version of the latter, WakefulIntentService). Second, if you're not targeting specifically WiFi, you need a WakeLock, not a WifiLock. WakeLock keeps the device awake, while WifiLock keeps WiFi enabled. The former usually implies the latter. Your permission (android.permission.WAKE_LOCK) is for WakeLock, as well. -- Kostya 02.11.2010 17:16, Ferran Garriga Ollé пишет: I'm trying to download a large .zip file from a web server but I have a weird behaviour, the description is: - I'm executing the code in the device emulator, API level 3 (version 1.5) with an SD card of 512MB. I start the device with Wipe data user - The length of the size from conexion.getContentLength() is 7012725 - The server address is localhost (10.0.2.2), but I've tried with an external server and the behaviour is the same. I've double checked that I can download the file through a web browser. - I have these permisions in the manifest file: uses-permission android:name=android.permission.INTERNET/uses- permission uses-permission android:name=android.permission.WRITE_EXTERNAL_STORAGE/uses- permission The error: - It starts downloading the file, I can see the text 10, 20, 30, 40, 50 and then it stops at 60. - After a while, the emulator reboots itself. Workarounds: - About the possible wifi lock, what I've done is add this permission android.permission.WAKE_LOCK and then this piece of code, but with exactly the same behaviour: WifiManager.WifiLock wifilock; WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifilock = manager.createWifiLock(wifilock); wifilock.acquire(); ... wifilock.release(); Here is the code, that it's being executing in a separate thread: private void downloadData(){ try{ Log.v(TAG, downloading data); URL url = new URL(http://10.0.2.2/1.zip;); URLConnection conexion = url.openConnection(); conexion.connect(); int lenghtOfFile = conexion.getContentLength(); Log.v(TAG, lenghtOfFile = +lenghtOfFile); InputStream is = url.openStream(); File testDirectory = new File(Environment.getExternalStorageDirectory()+/testDirectory/); if(!testDirectory.exists()){ testDirectory.mkdir(); } FileOutputStream fos = new FileOutputStream(testDirectory+/ files.zip); byte data[] = new byte[1024]; int count = 0; long total = 0; int progress = 0; while ((count=is.read(data)) != -1) { total += count; int progress_temp = (int)total*100/lenghtOfFile; if(progress_temp%10 == 0 progress != progress_temp){ progress = progress_temp; Log.v(TAG, total = +progress); } fos.write(data, 0, count); } is.close(); fos.close(); Log.v(TAG, downloading finished); }catch(Exception e){ Log.v(TAG, exception in downloadData); e.printStackTrace(); } } ** more log description:** 00:00 It starts downloading: V/iPhoto ( 853): downloading data V/iPhoto ( 853): lenghtOfFile = 7732809 V/iPhoto ( 853): total = 10 V/iPhoto ( 853): total = 20 V/iPhoto ( 853): total = 30 V/iPhoto ( 853): total = 40 V/iPhoto ( 853): total = 50 (round 00:05) - Here it stops and the DDMS disconnects the device immediatly 03:40 It finish the download (not always) and the device reboots on its own: I/Process ( 595): Sending signal. PID: 595 SIG: 3 I/dalvikvm( 595): threadid=7: reacting to signal 3 D/dalvikvm( 722): GC freed 2193 objects / 135808 bytes in 176 sec V/iPhoto ( 853): total = 60 I/dalvikvm( 595): Wrote stack trace to '/data/anr/traces.txt' I/ActivityManager( 595): Process com.google.android.apps.maps:FriendService (pid 778) has died. I/ActivityManager( 595): Process com.android.mms (pid 732) has died. V/iPhoto ( 853): total = 70 V/iPhoto ( 853): total = 80 V/iPhoto ( 853): total = 90 V/iPhoto ( 853): total = 100 V/iPhoto ( 853): downloading finished V/iPhoto ( 853): thread finish loading