[android-developers] Download large file from network to SD card

2010-11-02 Thread 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
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

2010-11-02 Thread Kostya Vasilyev

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