para - manual de programacion android pdf
Android descarga archivos de gran tamaño (2)
El "emulador que se reinicia" no suena bien. Recomiendo que inicie Logcat en la máquina de desarrollo y que inicie sesión en un archivo ... es decir, en una máquina de desarrollo de Linux algo así como
adb logcat | archivo de registro de tee
Luego mire el archivo de registro y vea qué puede aprender sobre por qué se reinició.
Intento descargar un gran archivo .zip de un servidor web pero tengo un comportamiento extraño, la descripción es:
- Estoy ejecutando el código en el emulador de dispositivo, API nivel 3 (versión 1.5) con una tarjeta SD de 512MB. Comienzo el dispositivo con "Eliminar usuario de datos"
- La longitud del tamaño de conexion.getContentLength () es 7012725
- La dirección del servidor es localhost (10.0.2.2), pero lo he intentado con un servidor externo y el comportamiento es el mismo. He verificado que puedo descargar el archivo a través de un navegador web.
- Tengo estos permisos en el archivo manifiesto:
-
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
El error:
- Comienza a descargar el archivo, puedo ver el texto 10, 20, 30, 40, 50 y luego se detiene en 60.
- Después de un tiempo, el emulador se reinicia.
Soluciones:
- Este problema en stackoverflow está funcionando en el dispositivo, no en mi caso.
Acerca de este problema de bloqueo wifi lo que he hecho es agregar este permiso "android.permission.WAKE_LOCK" y luego este fragmento de código, pero con exactamente el mismo comportamiento:
WifiManager.WifiLock wifilock; Administrador de WifiManager = (Administrador de Wifi) getSystemService (Context.WIFI_SERVICE); wifilock = manager.createWifiLock ("wifilock"); wifilock.acquire (); ... wifilock.release ();
Aquí está el código, que se está ejecutando en un hilo separado:
private void downloadData(){
try{
Log.v(TAG, "downloading data");
URL url = new URL("http://10.0.2.2/1.zip");
URLConnection connection = url.openConnection();
connection.connect();
int lenghtOfFile = connection.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();
}
}
¿Cualquier pista? Muchas gracias.
Actualiza con más descripción de registro:
Hola Chris, al principio he intentado descubrir qué estaba pasando con este registro en el entorno de Eclipse. Aquí hay un poco más de detalles sobre lo que está sucediendo (tiempo - acción), tenga en cuenta que he cambiado el archivo para descargarlo en otro para hacer más pruebas, pero los resultados son bastante similares:
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 immediately
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 dying...
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
D/qemud ( 560): fdhandler_event: disconnect on fd 12
E/vold ( 550): Framework disconnected
I/Zygote ( 554): Exit zygote because system server (595) has terminated
I/ServiceManager( 549): service ''simphonebook'' died
I/ServiceManager( 549): service ''isms'' died
I/ServiceManager( 549): service ''iphonesubinfo'' died
I/ServiceManager( 549): service ''phone'' died
D/AndroidRuntime( 949):
D/AndroidRuntime( 949): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
... and starting ...
¿Alguien podría probar mi código y descargar un archivo zip con un tamaño de 8 MB? ¿Funciona para ti?
Acabo de probar este código en un dispositivo real y funciona perfectamente. Debe haber algo extraño en el emulador.